1.495 messaggi dal 27 dicembre 2005
Buongiorno,
io ho una tabella dove ho questi campi

nome | descrizione | codice_articolo | prezzo

1 xxxxxxx 2 20,00
2 yyyyyyy 2 25,00
3 yyyttyy 2 22,00

codice_articolo contiene un codice che si aggancia ad un altra tabella creando una relazione una a molti.

Ora io da questa tabella dovrei ottenere tutti i record che hanno codice articolo 2, però mi deve ritornare solo il record che ha il prezzo più basso, in questo caso il primo.

Suggerimenti ?
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
SELECT codice_articolo, MIN(prezzo)
FROM dbo.Tabella
GROUP BY codice_articolo


Se ti servono altri attributi di questa tabella dovranno essere l'argomento di una funzione di aggregazione. Ad esempio se volessi una descrizione tra quelle che hanno stesso codice articolo dovresti indicare se vuoi la più alta (in senso alfabetico), la più bassa, etc.
Se vuoi recuperare la descrizione sulla base del prezzo che hai ottenuto dalla query sopra dovrai mettere in join la tabella originaria con la tabella derivata risultante dalla query di cui sopra, ovvero

SELECT T.descrizione, T.codice_articolo, A.minprezzo
FROM dbo.Tabella T INNER JOIN
    (SELECT codice_articolo, MIN(prezzo) minprezzo
      FROM dbo.Tabella
      GROUP BY codice_articolo) AS A
    ON T.codice_articolo = A.codice_articolo AND T.prezzo = A.minprezzo


Bye
1.495 messaggi dal 27 dicembre 2005
l.bianchi ha scritto:
SELECT codice_articolo, MIN(prezzo)
FROM dbo.Tabella
GROUP BY codice_articolo


Se ti servono altri attributi di questa tabella dovranno essere l'argomento di una funzione di aggregazione. Ad esempio se volessi una descrizione tra quelle che hanno stesso codice articolo dovresti indicare se vuoi la più alta (in senso alfabetico), la più bassa, etc.
Se vuoi recuperare la descrizione sulla base del prezzo che hai ottenuto dalla query sopra dovrai mettere in join la tabella originaria con la tabella derivata risultante dalla query di cui sopra, ovvero

SELECT T.descrizione, T.codice_articolo, A.minprezzo
FROM dbo.Tabella T INNER JOIN
    (SELECT codice_articolo, MIN(prezzo) minprezzo
      FROM dbo.Tabella
      GROUP BY codice_articolo) AS A
    ON T.codice_articolo = A.codice_articolo AND T.prezzo = A.minprezzo


Bye

Direi che la prima Query vada bene , però se la group by mi ritorna due prodotti che hanno lo stesso prezzo più basso, li ottengo tutti e due ?
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
No, ne ottieni uno.
Con quella query non stai chiedendo "quanti" ma soltanto "quali". Se volessi sapere anche il "quanti" dovresti scrivere

SELECT A.codice_articolo, A.minprezzo, COUNT(A.codice_articolo)
FROM dbo.Tabella T INNER JOIN
    (SELECT codice_articolo, MIN(prezzo) minprezzo
     FROM dbo.Tabella
     GROUP BY codice_articolo) AS A
       ON T.codice_articolo = A.codice_articolo AND T.prezzo = A.minprezzo
GROUP BY A.codice_articolo, A.minprezzo
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
totti240282 ha scritto:
se la group by mi ritorna due prodotti che hanno lo stesso prezzo più basso


Attenzione: nella mia risposta precedente assumevo che quando parli di "2 prodotti che hanno lo stesso prezzo" parlassi di "2 descrizioni differenti per uno stesso cod_articolo". Se invece ti riferisci a 2 cod_articolo differenti, di ciascuno di essi ti verrà restituito quello con il prezzo più basso; non importa se coincide con quello di un altro cod_articolo.
Dal momento che il raggruppamento è fatto sulla base del cod_articolo, non potrà esserci nessun cod_articolo che viene ignorato a prescindere che abbia una sola riga o più righe a meno che non lo escludi esplicitamente con una condizione WHERE.
In ogni caso e in qualunque scenario i campi indicati nella clausola GROUP BY sono sempre e comunque UNIVOCI nel recordset restituito.

Bye
1.495 messaggi dal 27 dicembre 2005
Allora forse mi sono spiegato male io.
Il codice articolo si riferisce allo stesso prodotto.

Prima infatti parlavo di due tabelle correlate tra loro tramite una relazione una a molti

Tabella A

codice_articolo | descrizione

Tabella B

nome | descrizione | codice_articolo | prezzo

1 xxxxxxx 2 20,00
2 yyyyyyy 2 25,00
3 yyyttyy 2 22,00

Nella tabella B ci sono tre prodotti che sono gli stessi ma di diversi fornitori.
Io vorrei sapere quale fornitore fa il prezzo più basso.
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
Il fornitore non lo so; non è nella struttura di nessuna delle 2 tabelle che hai postato. Nella tabella B vedo una descrizione differente per 3 cod_articolo uguali. Se questa è l'informazione che vuoi sapere devi utilizzare la seconda query che ho indicato nel primo messaggio. In questo caso se ci sono 2 cod_articolo con lo stesso prezzo la query di cui alla tabella derivata restituirà ovviamente un solo record (il suo compito è quello di individuare il prezzo più basso di ciascun articolo) ma poi, nella join di questa tabella derivata con la tabella che ora hai chiamato "Tabella B" (che è la medesima tabella utilizzata nella query interna; la tabella A non l'abbiamo mai presa in considerazione) verranno restituiti tutti i record che soddisfano la condizione di join, ovvero se ci sono 2 diverse descrizioni per uno stesso cod_articolo e che hanno lo stesso prezzo (più basso degli altri) ti verranno restituite 2 righe con lo stesso cod_articolo e lo stesso prezzo ma con 2 descrizioni differenti.
Ti consiglio in ogni caso, di provare ad eseguire ciascuna delle query che ti ho proposto perché vista la semplicità delle stesse è sicuramente più agevole capirne il funzionamento esaminandone i risultati che non capirlo leggendo un post.

Bye
Modificato da l.bianchi il 21 settembre 2012 10.07 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.