2010-04-27 5 views
171

Ho una query di selezione sql con un gruppo per. Voglio contare tutti i record dopo il gruppo per istruzione. C'è un modo per questo direttamente da sql? Ad esempio, avere un tavolo con gli utenti che voglio selezionare le diverse città e il numero totale di utentiCome utilizzare il conteggio e raggruppare con la stessa istruzione di selezione

select town, count(*) from user 
group by town 

voglio avere una colonna con tutte le città e un altro con il numero di utenti in tutto filari.

Un esempio del risultato per avere 3 città e 58 utenti in totale è:

Town   Count 
Copenhagen 58 
NewYork  58 
Athens  58 
+0

vuoi dire che vuoi che il tuo set di risultati abbia 2 conteggi per le città e uno per gli utenti? – Leslie

+2

Quindi vuoi una riga per ogni città, e in ogni riga, la colonna 2 contiene il conteggio totale di tutti gli utenti? Quindi la colonna 2 ha lo * stesso * valore per ogni riga? Se modifichi per includere i dati di esempio e l'output richiesto, saremo in grado di darti esattamente ciò che desideri. – AakashM

+0

Hai ragione AakashM! L'ho appena modificato. – Stavros

risposta

218

Questo farà ciò che si vuole (l'elenco delle città, con il numero di utenti in ogni):

select town, count(town) 
from user 
group by town 

È possibile utilizzare la maggior parte aggregate functions quando si utilizza GROUP BY.

Aggiornamento (seguente modifica a mettere in discussione e commenti)

È possibile dichiarare una variabile per il numero di utenti e impostarlo sul numero di utenti, quindi selezionare con quello.

DECLARE @numOfUsers INT 
SET @numOfUsers = SELECT COUNT(*) FROM user 

SELECT DISTINCT town, @numOfUsers 
FROM user 
+0

questo è esattamente ciò che l'OP ha scritto? nvm, vedo la tua differenza, stai contando Città non * .... – Leslie

+0

@Leslie - non c'è differenza tra le due query. Restituiranno lo stesso set di risultati. Non mi piace l'uso di '*' ... L'OP ha risposto alla sua domanda, ma non sembra nemmeno testarlo, sto solo confermando che è corretto :) http://www.fredosaurus.com/notes- db/select/groupby.html – Oded

+6

COUNT (*) potrebbe non essere uguale a COUNT (città). L'utilizzo di * in COUNT è perfettamente valido ... – gbn

3

Con Oracle è possibile utilizzare le funzioni analitiche:

select town, count(town), sum(count(town)) over() total_count from user 
group by town 

Le altre opzioni è quello di utilizzare una sottoquery:

select town, count(town), (select count(town) from user) as total_count from user 
group by town 
+0

qualcosa come l'ultima avrebbe funzionato, ma volevo vedere se c'è un'altra soluzione .. – Stavros

+0

E non puoi usare la prima opzione (funzione analitica)? Quale piattaforma di database stai usando? – Tommi

+0

@Stavros: l'ultimo è lento. –

25

L'altro modo è:

/* Number of rows in a derived table called d1. */ 
select count(*) from 
(
    /* Number of times each town appears in user. */ 
    select town, count(*) 
    from user 
    group by town 
) d1 
+5

ha bisogno dell'alias altrimenti non funzionerebbe in mysql. selezionare il conteggio (*) da() agr – amas

2

Se vuoi ordinare per conteggio (sembra semplice ma io `t trovato una risposta sulla pila di come farlo) si può fare:

 SELECT town, count(town) as total FROM user 
     GROUP BY town ORDER BY total DESC 
119

È possibile utilizzare COUNT(DISTINCT ...):

SELECT COUNT(DISTINCT town) 
FROM user 
+3

funziona come un incantesimo ... dovrebbe essere scelta la risposta principale .. eccetto che alcuni sondano che questo non è buono. – Victor

+0

Non funziona in combinazione con una clausola WHERE. –

+0

@PerLindberg, funziona bene per me. Aggiungi WHERE dopo FROM. – milkovsky

2

È possibile utilizzare DISTINCT all'interno del COUNT come quello che milkovsky detto

nel mio caso:

select COUNT(distinct user_id) from answers_votes where answer_id in (694,695); 

Questo tirerà il conteggio dei voti risposta considerata la stessa u ser_id come un conteggio

1

Se si desidera selezionare città e conteggio complessivo degli utenti, è possibile utilizzare questa query di seguito:

SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town; 
0

Provate il seguente codice:

select ccode, count(empno) 
from company_details 
group by ccode; 
+0

puoi spiegare cosa sta facendo questo codice. Grazie – MZaragoza

+0

usiamo questo codice per trovare quanti dipendenti totali per il calcolo del giorno presente in ogni ccode (codice azienda) esempio: count (empno) è 1839 per ccode 1 e count (empno) è 9421 per ccode 47. – balajibran

2

So che questo è un vecchio post, in SQL Server:

select isnull(town,'TOTAL') Town, count(*) cnt 
from user 
group by town WITH ROLLUP 

Town   cnt 
Copenhagen 58 
NewYork  58 
Athens  58 
TOTAL  174 
+4

C'è niente di sbagliato nel rispondere ai vecchi post. Tuttavia, includi una spiegazione del tuo codice e del codice stesso. – Shelvacu

0

se si desidera utilizzare Seleziona tutte le query con opzione Count, provare questo ...

select a.*, (Select count(b.name) from table_name as b where Condition) as totCount from table_name as a where where Condition 
+0

Grazie per questo snippet di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione appropriata [migliorerebbe notevolmente] (// meta.stackexchange.com/q/114762) il suo valore a lungo termine mostrando * perché * questa è una buona soluzione al problema e lo renderebbe più utile ai futuri lettori con altre domande simili. Per favore [modifica] la tua risposta per aggiungere qualche spiegazione, incluse le ipotesi che hai fatto. –

Problemi correlati