Ho passato molto tempo a cercare questo, per favore fatemi sapere se duplicato.SQL: Raggruppa per numero (*) come numero totale di righe di tabella
Ho bisogno di scrivere una query raggruppata che restituisca le categorie di record con il conteggio di ciascun tipo di categoria. Qualcosa del genere:
select categorynum, count(*) from tbl group by categorynum;
Fin qui tutto bene. Ora ciò di cui ho bisogno è determinare quale percentuale del totale dei conteggi di ogni categoria occupi. Il migliore che ho venire in mente è questa, che non mi piace, ci si sente sporca:
select categorynum, count(*), count(*)/(select count(*) from tbl) from tbl group by categorynum;
Funziona, ma è davvero fastidioso me a farlo in questo modo. Il database che uso è compatibile con Postgres e count(*)
su un tavolo è molto veloce, quindi non c'è un enorme aumento di velocità per fare un count(*)
sul tavolo, anche se mi piacerebbe scrivere meglio SQL se possibile.
Quindi c'è un modo migliore per scrivere questo? Questa è una situazione in cui mi imbatto spesso, quindi mi piacerebbe scrivere correttamente le mie domande.
Questo è più complicato dell'originale, ma funzionerà più velocemente? Questo tipo di query ha molte potenziali applicazioni, grazie per il puntatore! –
Bene, se ci sono pochi valori di 'categorynum' rispetto al numero di righe in' tbl', allora la maggior parte del lavoro verrà eseguita nella subquery. Se la proporzione di 'categorynum' distinti rispetto al numero di righe in' tbl' è relativamente alta, la 'somma' potrebbe rallentare troppo. Controllerei il piano delle query tramite un 'explain' per entrambe le query. E tu sei il benvenuto :) –