Newsgroup: it.comp.lang.visual-basic
Titolo: Help Query

Ciao a tutti,
scusate il semi-ot, ma sono quasi le 18.00 e non connetto :)
Ho una tabella del tipo
ARTBASE	PROGRIGA	QTAIMPOR	TOTPARZ
5	1		10		20
5	2		20		21
5	3		35		15
6	1		1		2
6	2		5		15
E devo fare una query che mi tiri fuori QTAIMPOR+TOTPARZ del prog riga più
grande group by ArtBase
5	sum(35+15)
6	sum(5+15)
La mia query invece tira fuori:
5	sum(35+15)
Perchè prende solo il record con progriga più alto
SELECT ARTBASE,SUM(COALESCE(QTAIMPOR,0)+COALESCE(TOTPARZ,0))
FROM STAMPA1 WHERE PROGRIGA=
(SELECT MAX(PROGRIGA)  FROM STAMPA1 WHERE ARTBASE=ARTBASE)
GROUP BY ARTBASE
E' possibile tirar fuori quello che voglio?
Grazie a tutti

Andrea scriveva il 13/04/2006 :

Se deve esserci un progriga 'più alto' per ogni ArtBase, manca una 
chiave nella sottoquery.
Inoltre, SUM è una funzione di aggregazione, non ha senso utilizzarla 
per estrarre un singolo record.
SELECT A.ARTBASE,SOMMA=COALESCE(A.QTAIMPOR,0)+COALESCE(A.TOTPARZ,0)
FROM STAMPA1 AS A
INNER JOIN
(SELECT MAX(PROGRIGA) AS PROG, ARTBASE
FROM STAMPA1
GROUP BY ARTBASE) AS B
ON A.PROGRIGA=B.PROG
AND A.ARTBASE=B.ARTBASE
L'ho scritta così a braccio, mettila a posto tu se ci sono errori.
Ciao
Alberto
-- 
A questo punto hanno trovato un muro,
un muro duro, molto molto duro,
che siamo noi.

 L'ho scritta così a braccio, mettila a posto tu se ci sono errori.
Ti ringrazio.
Purtroppo firebird non gradisce la INNER JOIN SELECT (oltre agli AS sui
nomi delle tabella).
Se non riesco scorrerò tutta la tabella con ado con tipo
SELECT ARTBASE,PROGRIGA,QTAIMPOR+TOTPARZ AS SOMMA
FROM STAMPA1
ORDER BY ARTBASE,PROGRIGA DESC
oldart=0
do until rs.eof
  art=rs("ARTBASE")
  if oldart<>art then
    tot=rs("SOMMA")
    'operazioni varie
    oldart=art
  endif
  rs.movenext
loop

 nomi delle tabella).
Gli AS sono pura sintassi (magari, se si prendesse l'abitudine di 
specificare con quale dbms si sta operando, si eviterebbero malintesi), 
e puoi toglierli.
La INNER JOIN (SELECT...
*deve* essere supportata.
Cioè, se non è supportata una cosa del genere, si impazzisce. Magari ci 
vorrà qualche separatore diverso dalla parentesi, oppure una virgoletta 
da qualche parte, ma sicuramente in qualche modo la supporta.
Alla più brutta, utilizza una tabella in Ram:
SELECT MAX(PROGRIGA) AS PROG, ARTBASE
INTO #TAB_TEMP
FROM STAMPA1
GROUP BY ARTBASE
SELECT STAMPA1.ARTBASE,SOMMA=
COALESCE(STAMPA1.QTAIMPOR,0)+COALESCE(STAMPA1.TOTPARZ,0)
FROM STAMPA1
INNER JOIN #TAB_TEMP
ON STAMPA1.PROGRIGA=#TAB_TEMP.PROG
AND STAMPA1.ARTBASE=#TAB_TEMP.ARTBASE
Ma non mi dire che non supporta neppure questo, altrimenti il mio 
consiglio potrebbe diventare offensivo nei confronti dello strumento...


 consiglio potrebbe diventare offensivo nei confronti dello strumento...
... pare non supporti la INTO nell'sql normale ma solo nell'embedded (che
non so cosa vuol dire)
| INTO :var [, var …]	Singleton select in embedded SQL only; specifies a
| list of host-language variables into which to retrieve values
Comunque con quel A e B sono riuscito a far funzionare la mia query, almeno
sembrerebbe (è molto legnosa :D) :)
SELECT ARTBASE,SUM(COALESCE(QTAIMPOR,0)+COALESCE(TOTPARZ,0))
FROM STAMPA1 A WHERE PROGRIGA=
(SELECT MAX(PROGRIGA)  FROM STAMPA1 B WHERE B.ARTBASE=A.ARTBASE)
GROUP BY ARTBASE
-- 
DBMS Firebird
VB6 + Ado