Newsgroup: it.comp.lang.visual-basic
Titolo: [?SQL] Where e Order By

La seguente istruzione SQL:
Select Codice, (Q1+Q2+Q3) As Totale From Articoli
funziona sia in DAO che in ADO
Se la modifico in:
Select Codice, (Q1+Q2+Q3) As Totale From Articoli Where Totale<>0
non funziona nè in DAO nè in ADO
Se la modifico in:
Select Codice, (Q1+Q2+Q3) As Totale From Articoli Order By Totale
funziona in ADO, ma non in DAO (sic!)
Se la modifico in:
Select Codice, (Q1+Q2+Q3) As Totale From Articoli Where Totale<>0 Order By
Totale
non funziona, a causa del Where, nè in DAO nè in ADO
Considerando che la colonna Totale è il risultato di un'elaborazione
(nell'esempio una somma, ma potrebbe essere un subquery complicata), come
posso (in particolare in ADO, ma meglio se funzionasse anche in DAO)
considerarne il suo "risultato" sia nella Where che nella Order By?
Grazie (non ne posso più!)

Una nota aggiuntiva (oltre ad ammettere che ho fatto Cross-Posting, se così
si dice):
Non posso usare .Filter e/o .Sort.
Ho bisogno che il tutto venga fatto in una singola istruzione SQL.
Grazie ancora.

 considerarne il suo "risultato" sia nella Where che nella Order By?
prova cosě :
Select Codice, (Q1+Q2+Q3) As Totale From Articoli Where  (Q1+Q2+Q3) <>0
Order By (Q1+Q2+Q3)
ciao!

 Grazie ancora.
ho costruito una tabella con Access 2000,  e realizzato la query.
Ad oggi non mi č stato sufficiente incollare la query nella costruzione
del codice VB:
SELECT tblArticoli.Codice, [q1]+[q2]+[q3] AS Somma
FROM tblArticoli
GROUP BY tblArticoli.Codice, [q1]+[q2]+[q3]
HAVING ((([q1]+[q2]+[q3])<>0))
ORDER BY [q1]+[q2]+[q3];
Se ricordo bene  ORDER BY vuole la clausola HAVING
giuseppeD
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ho costruito una tabella con Access 2000,  e realizzato la query.
mi correggo:
Ad oggi mi è stato sufficiente incollare la query nella costruzione


 Order By (Q1+Q2+Q3)
Ok, ma, come avevo scritto, se quella somma fosse invece una subquery?
Del tipo:
Select
fatture.cod_cliente,
(Select clienti.des_cliente from clienti where
clienti.cod_cliente=fatture.cod_cliente) As rag_sociale
From fatture
Where rag_sociale='Rossi & C. SpA'
Order by rag_sociale
Approfitto anche per un'altra precisazione: La Inner Join funzionerebbe, ma
mi restituisce solo i records che hanno il campo di 'join' definito e mi
spiego:
Select
mov.articolo, articoli.desart
From mov inner join articoli on mov.articolo=articoli.codice_articolo
Where articoli.desart='Vite'
Order by articoli.desart
Questa funziona (oddio, l'ho scritta al volo...), ma se nella tabella mov ho
dei movimenti senza articolo (righe descrittive) non mi verranno mai
restituite.
Invece con questa:
Select
mov.articolo,
(Select articoli.desart From articoli where
articoli.codice_articolo=mov.articolo) as descrizione_articolo
Where articoli.desart='Vite'
Order by articoli.desart
a parte Where e Order by, mi restituisce anche righe dove mov.articolo č
vuoto (righe descrittive).

 ha scritto
giuseppe, grazie, ma vedi, per favore, il mio post in risposta a wild

 ha scritto nel messaggio
news:kImS8.69782$Kt3.1...@twister2.libero.it...


 JOIN o la RIGHT JOIN, dipende da che parte sta la tabella principale
...
Grazie molte, provo subito.

Ecco, dichiarando come "fonte dati" prioritaria la tabella mov:
Select
mov.articolo, articoli.desart
From mov LEFT join articoli on mov.articolo=articoli.codice_articolo
Where articoli.desart='Vite'
Order by articoli.desart
così funziona sia la Where che l'Order By e, togliendo la Where, restituisce
anche i movimenti col campo mov.articolo vuoto.


mmm sicuro che nel tuo caso tu non debba fare una RIGHT JOIN?
a vederla cosě mi sa tanto che se non hai un movimento di un articolo non ti
salta fuori l'articolo nella join
Select mov.articolo, articoli.desart
From mov RIGHT join articoli on mov.articolo=articoli.codice_articolo
Where articoli.desart='Vite'
Order by articoli.desart
oppure ribalta la join
Select mov.articolo, articoli.desart
From articoli LEFT join mov on articoli.codice_articolo=mov.articolo
Where articoli.desart='Vite'
Order by articoli.desart
ciao


 salta fuori l'articolo nella join
Esatto. Se voglio esporre i movimenti devo vedere solo quelli (e i relativi
articoli, se e quando citati nel movimento). Ribaltandola, correttamente, mi
espone tutti gli articoli dell'archivio e i movimenti degli stessi, comprese
righe vuote per gli articoli che non hanno movimenti.


Ah ok pensavo ti servisse sempre avere l'articolo, beh l'importante è che
comunque tu abbia risolto :D
P.S.
per query con sottoquery, etc... se hai la possibilità di fare Stored
Procedure fallo perchè velocizzi e riesci anche a fare a meno di ripetere
query più volte, anche Access permette di avere stored procedure che però
non so se siano potenti come quelle di MS SQL, ma devi però avere la
versione developer per poterle creare, con Access normale non puoi


Select
mov_id, mov.articolo, art.codice_art, art.desart
From mov RIGHT join art on mov.articolo=art.codice_art
Order by art.desart
Questa è la query ribaltata (ho cambiato solo LEFT in RIGHT e ho messo i
veri nomi dei miei campi e tabelle), ovvero quella che dà priorità
all'archivio articoli e poi cerca nella tabella MOV.
Chiaramente mi elenca tutti gli articoli dell'archivio e, solo per quelli
movimentati, i relativi movimenti. Certamente non mi elencherà i movimenti
che non citano l'articolo, perchè, giustamente, gli manca la "fonte".
Così è più "leggibile":
Select
art.codice_art, art.desart, mov_id, mov.articolo
From art LEFT join mov on art.codice_art=mov.articolo
Order by art.desart