2011-11-11 11 views
5

Ho bisogno di ottenere il conteggio delle righe di una query e di ottenere anche le colonne della query in una singola query. Il conteggio dovrebbe essere una parte delle colonne del risultato (dovrebbe essere lo stesso per tutte le righe, poiché è il totale).Ottenere il conteggio delle righe compresi i valori delle colonne in sql server

ad esempio, se faccio questo: select count(1) from table Posso avere il numero totale di righe.

Se si esegue questa operazione: select a,b,c from table Otterrò i valori della colonna per la query.

Quello che mi serve è ottenere il conteggio e i valori delle colonne in una query, con un modo molto efficace.

Ad esempio: select Count(1), a,b,c from table senza gruppo da, poiché voglio il totale.

L'unico modo che ho trovato è di fare una tabella temporanea (usando variabili), inserire il risultato della query, poi contare, quindi restituire il join di entrambi. Ma se il risultato ottiene migliaia di record, non sarebbe molto efficiente.

Qualche idea?

risposta

8

@Jim H è quasi giusto, ma sceglie la funzione di rango sbagliato:

create table #T (ID int) 
insert into #T (ID) 
select 1 union all 
select 2 union all 
select 3 
select ID,COUNT(*) OVER (PARTITION BY 1) as RowCnt from #T 
drop table #T 

Risultati:

ID RowCnt 
1 3 
2 3 
3 3 

partizionamento da un la costante fa contare su tutto il set di risultati.

+0

Questo sembra l'unico in cui non devo duplicare la query, ma solleva domande sulle prestazioni! Rimango con questa soluzione. –

+1

FYI, puoi usare anche una clausola OVER vuota http://stackoverflow.com/a/5147055/27535 – gbn

0

Si potrebbe fare così:

SELECT x.total, a, b, c 
FROM 
    table 
    JOIN (SELECT total = COUNT(*) FROM table) AS x ON 1=1 

che riporterà il numero totale di record nella prima colonna, seguita da campi a, b & c

+0

Come il primo, sto cercando di evitare di duplicare la query, grazie comunque. –

1

Guarda le Ranking funzioni di SQL Server.

SELECT ROW_NUMBER() OVER (ORDER BY a) AS 'RowNumber', a, b, c 
FROM table; 
+0

L'OP vuole lo stesso valore per ogni riga; questo fornirà un numero sequenziale unico per ogni riga. –

5

Utilizzando CROSS JOIN:

SELECT a.*, b.numRows 
     FROM YOUR_TABLE a 
CROSS JOIN (SELECT COUNT(*) AS numRows 
       FROM YOUR_TABLE) b 
+0

Grazie, questo mi farà fare la domanda due volte però ... Sto cercando di evitare questo, ma non ho trovato un modo. –

Problemi correlati