PDA

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

gugoXX
24-05-2009, 14:25
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

gugoXX
24-05-2009, 14:41
.

gugoXX
24-05-2009, 14:43
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 ***************************

gugoXX
24-05-2009, 15:08
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

gugoXX
24-05-2009, 15:22
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?

gugoXX
24-05-2009, 18:53
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.