Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Query per ultimo ordine (o fattura, o bolla, o quel che vi pare)

Supponiamo di avere una tabella con questi campi:
Ordini
ordine cliente data
1      rossi   23/10/2002
2      verdi   20/11/2002
3      bianchi 10/09/2002
4      rossi   18/12/2002
5      rossi   23/12/2002
6      verdi   07/12/2002
...
Voglio sapere per ogni cliente qual'e' stato l'ultimo ordine.
Io ho sempre usato il codice ed in quel caso non ci sono problemi:
rs = recordset con i clienti: SELECT distinct cliente FROM ordini
while not rs.eof
    bl = recordset con l'ultimo ordine:
    SELECT first(bolla) FROM ordini WHERE cliente='" & rs!cliente & "'
ORDER BY data DESC"
 
    rs.movenext
wend
E' possibile tradurre l'esempio di questo pseudo codice in una query?
Ovvero data una query ed una sottoquery come si puo' fare in modo che
dagli N risultati della sottoquery si generino N query principali?
grazie
	maxx
P.S. Probabilmente sta roba ha gia' un nome, ma io non lo conosco e non
lo trovo ...
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 ha scritto
SELECT TOP 1 BOLLA
FROM BOLLA
ORDER BY PROGRESSIVO DESC
Ciao
Alberto

SELECT    Customer , MAX(OrderDate) AS MaxOrder
FROM         Orders
GROUP BY Customer
ORDER BY Customer
giuseppeD

 ORDER BY PROGRESSIVO DESC
uhm... manca il cliente....
Avrei pensato a una cosa del tipo
"Select max(ordine) as ultimo, cliente from NomeTabella group by cliente"
Salutoni
Sergio

 uhm... manca il cliente....
Giusto. Ammetto che avevo letto il post troppo velocemente...
Quindi:
select * from tabella as T1
where t1.progressivo=
(select top 1 t2.progressivo from tabella as T2
where t1.cliente=t2.cliente
order by t2.progressivo desc)
Non ricordo bene se qualche alias va rimosso e viene considerato
implicitamente, ma la strada è questa.
Ciao
Alberto

[Albe V財 ha scritto:
(snip)
Diavolo di un albe!
Questa query non restituisce solo il numero dell'ultimo ordine per ciascun
cliente, ma tutto il record dell'ordine!
Grande!
Salutoni
Sergio

 
Se fossi interessato al solo cliente andrebbe bene, ma a me interessa la 
bolla, cioe' voglio il numero dell'ultimo ordine fatto da ogni cliente ...
Non vi rovinavo il pranzo se era cosi' facile ... ;-)
grazie
	maxx


 cliente, ma tutto il record dell'ordine!
C'è un'altra finezza, insita nella query: l'identificatore del record (che
io ho chiamato genericamente progressivo), potrebbe anche essere non
progressivo, ad esempio un uniqueidentifier, e l'ordinamento completamente
diverso, ad esempio basato su una data, o sull'importo.
Esempio:
Voglio, in ordine crescente di numero telefonico del cliente, le fatture, di
ciascun cliente, di minor importo
select * from tabella as T1
where t1.id_fattura=
(select top 1 t2.id_fattura from tabella as T2
where t1.cliente=t2.cliente
order by t2.importo ASC)
order by numero_telefonico ASC
Pura masturbazione mentale.
Ciao
Alberto

 
No, no! Nel mio caso infatti:
select * from ordine AS t1
WHERE t1.bolla=
(SELECT top 1 t2.bolla FROM ordine as t2
WHERE t1.cliente=t2.cliente
ORDER BY t2.data DESC)
Avevi gia' postato questo esempio, solo che non mi ricordavo chi lo 
aveva postato....
grazie
	maxx
P.S. "La cultura e' tutto cio' che si sa quando si e' dimenticato cio' 
che si e' studiato"  (Qualcuno)
P.P.S. La struttura che mi hai suggerito la utilizzo da anni in alcuni 
programmi, ma la avevo dimenticata ... :-(


 
Accidenti ho trovato un baco in questa query. :-(
Se un cliente ha 2 ordini nella stessa data la subquery (SELECT top 1 
... restituisce 2 record e la query principale si arrabbia (WHERE 
t1.bolla =   ...)
Si puo' sostituire l'uguale con IN ma ovviamente si ottengono delle 
righe ripetute per tutti quei clienti che hanno piu' bolle nella stessa 
data ...
Comincio a capire perche' avevo abbandonato la query unica ed ero 
passato al codice ... :-(
Se qualcuno ha la soluzione ... ;-)
grazie
	maxx


 t1.bolla =   ...)
No.
Una select TOP 1 restituisce sempre solamente un record.
Se c'è un problema è da qualche altra parte.
Alberto

 
Si'!
"Returns a certain number of records that fall at the top or the bottom
of a range specified by an ORDER BY clause. Suppose you want the names
of the top 25 students from the class of 1994:
SELECT TOP 25
FirstName, LastName
FROM Students
WHERE GraduationYear = 1994
ORDER BY GradePointAverage DESC;
\cut
The TOP predicate doesn't choose between equal values. In the preceding
example, if the twenty-fifth and twenty-sixth highest grade point
averages are the same, the query will return *26* records."
Se c'č un problema e' nel TOP.
:-)
	maxx
P.S. A prescindere dalla guida ;-) , sono sicuro che top restituisce
tutti i record che soddisfano una certa condizione anche quelli doppi,
tripli, ecc. La ho utilizzata in molti programmmi ed ha sempre avuto
questo comportamento ...


[emmexx]
(snip)
La butto lě al volo, senza leggere approfonditamente la query....
Per quello che posso vedere, la clausola top č applicata sull'id, che sembra
essere progressivo ed univoco, non dovrebbero essere possibili doppioni...
Sbaglio qualcosa?
Salutoni
Sergio

 Puoi citare F1 !!! :-)
Ragazzi, non scherziamo.
TOP 1 restituisce solamente un record.
Fa eccezione a questo solamente Access, ma visto che non era stato
specificato alcun DB nei vari post, io mi stavo attenendo agli standard SQL.
Se uno vuole aiuto con una query su Access, occorre che lo indichi
chiaramente.
Ciao
Alberto


Puoi citare F1 !!! :-)
	maxx


 Una select TOP 1 restituisce sempre solamente un record.
Non è sempre così. Non so dove/cosa citare, ma pare che restituisca tutti i
records uguali...

 Sbaglio qualcosa?
Su questo hai ragione.
Il punto però è che, se uno utilizza un DB fuori standard, tipo Access, la
select all'interno della parentesi può ritornare n record (dipende
ovviamente dall'Order by interno, che se è sul progressivo ovviamente
impedisce ogni problema).
Nella query che avevo postato io:
select * from tabella as T1
where t1.progressivo=
(select top 1 t2.progressivo from tabella as T2
where t1.cliente=t2.cliente
order by t2.progressivo desc)
l'order by interno è sul progressivo univoco, quindi il problema non si
pone.
Maxx, però, ha modificato la query usando order by data, per cui i doppioni
possono nascere, ma solamente per Access.
Ciao
Alberto

 
Il titolo del thread dice "Query per ultimo ordine ... " il codice 
univoco per l'ordine non deve necessariamente essere un progressivo o un 
numero ...
Comunque mi sembra si possa dire che  TOP 1 di Access corrisponde a TOP 
1 WITH TIES di sql server.
	maxx
P.S. A proposito di standard:
Qui TOP non lo vedo:
http://developer.mimer.se/validator/sql-reserved-words.tml
Oracle, Postgressql, Mysql non usano TOP ma ognuno usa una sintassi 
particolare ...
Rimangono Sql Server e Access. Quale dei 2 fa standard? :-)
