View Full Version : [Mysql] Aiuto per una query
mosquita
24-05-2009, 10:35
Ciao a tutti
Vengo subito al dunque.....voglio sapere quante volte sono ripetuti in una tabelle i fornitori di un azienda, cosė;
SELECT fornitore, COUNT( * ) AS totale FROM fornitori GROUP BY (fornitore) having totale >1;
Mi presenta una schermata cosė;
+------------------------+--------+
| fornitore | totale |
+------------------------+--------+
| Tizio | 4 |
| Caio | 4 |
| Sempronio | 4 |
+------------------------+--------+
3 rows in set (0.00 sec)
Come faccio adesso a vedere le 4 righe "sciolte" di ciascun fornitore? In poche parole, come faccio a vedere le 12 righe?
Grazie
Mosq
Cosi'?
SELECT * FROM totale
ORDER BY fornitore
mosquita
24-05-2009, 14:39
Cosi'?
SELECT * FROM totale
ORDER BY fornitore
Totale non č una tabella, č un alias :mbe:
Mosq
Totale non č una tabella, č un alias :mbe:
Mosq
Era FROM fornitori ovviamente... lettura affrettata
Altrimenti spiega bene cos'hai e cosa vorresti avere, magari anche con un esempio.
Kralizek
24-05-2009, 14:56
SELECT * FROM Fornitori WHERE Fornitore IN
(
SELECT fornitore FROM fornitori GROUP BY (fornitore) having COUNT( * ) >1
)
cosė funziona?
mosquita
24-05-2009, 14:59
Era FROM fornitori ovviamente... lettura affrettata
Altrimenti spiega bene cos'hai e cosa vorresti avere, magari anche con un esempio.
Ok.
La prima query mi fa vedere quali sono i fornitori che si presentano + volte.
Voglio potere vedere, non un raggruppamento ma le tuple singole.
Es. Tizio si presenta ben 4 volte, vorrei vedere 4 tuple di tizio, 4 di Caio e 4 di Sempronio.
Voglio solo vedere, dei fornitori presentati + volte, ogni singola riga.
es:
*************************** 7. row ***************************
id_fornitori: 34
cod_for: 497717
fornitore: Tizio
tipologia: tizieggio
stato: attivo
note: NULL
key_user: Tizio
email: Tizio@tizio.it
*************************** 8. row ***************************
id_fornitori: 35
cod_for: 497717
fornitore: Tizio
tipologia: tizieggio
stato: attivo
note: NULL
key_user: Tizio
email: Tizio@tizio.it
*************************** 9. row ***************************
id_fornitori: 36
cod_for: 497717
fornitore: Tizio
tipologia: tizieggio
stato: attivo
note: NULL
key_user: Tizio
email: Tizio@tizio.it
*************************** 10. row ***************************
id_fornitori: 5
ccod_for: 497717
fornitore: Tizio
tipologia: tizieggio
stato: attivo
note: NULL
key_user: Tizio
email: Tizio@tizio.it
*************************** 11. row ***************************
Non ci sono.
Dici di volere una cosa pero' poi nell'esempio ne mostri un'altra.
Voglio potere vedere, non un raggruppamento ma le tuple singole.
Es. Tizio si presenta ben 4 volte, vorrei vedere 4 tuple di tizio
SELECT * FROM fornitori
ORDER BY id_fornitori
Se Tizio si presenta 4 volte, avrai 4 record di tizio, uno per ciascuna entry.
solo non e' trasposto, cosa che in SQL non e' affatto semplice.
Se ti serve proprio questo, lo saprei fare sotto Oracle e sotto SqlServer. Niente MySql mi spiace.
mosquita
24-05-2009, 15:11
Non ci sono.
Dici di volere una cosa pero' poi nell'esempio ne mostri un'altra.
Voglio potere vedere, non un raggruppamento ma le tuple singole.
Es. Tizio si presenta ben 4 volte, vorrei vedere 4 tuple di tizio
SELECT * FROM fornitori
ORDER BY id_fornitori
Se Tizio si presenta 4 volte, avrai 4 record di tizio, uno per ciascuna entry.
solo non e' trasposto, cosa che in SQL non e' affatto semplice.
Se ti serve proprio questo, lo saprei fare sotto Oracle e sotto SqlServer. Niente MySql mi spiace.
Scusa se mi sono spiegato male ma Kralizek ha capito.;)
SELECT * FROM Fornitori WHERE Fornitore IN
(
SELECT fornitore FROM fornitori GROUP BY (fornitore) having COUNT( * ) >1
)
cosė funziona?
Alla grande.....grazie 1000
Mosq
Scusa se mi sono spiegato male ma Kralizek ha capito.;)
Alla grande.....grazie 1000
Mosq
Pensavo fosse un problema di presentazione piu' che di contenuto.
Kralizek
24-05-2009, 17:14
gugo se fosse sql server, ci sarebbe qualche improvement possibile da un punto di vista delle performance?
Si potrebbe provare con una analytic function, ma non penso che si senta molto
SELECT * FROM (
SELECT *,COUNT(*) OVER (PARTITION BY id_fornitori) cnt
FROM fornitori
) AS tmp
WHERE cnt>1
Il concetto e' che viene letta tutta la tabella una volta sola, invece che 2 volte all'indice e una alla tabella come nella tua query.
Direi che si guadagna tanto di piu' quanti piu' sono i record che soddisfano la clausola.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.