2009-07-16 15 views
5

Ho la seguente query:Contare le righe totali con un gruppo da

select count(ords.TRACKING_NUM) 
from Orders ords (NoLock) 
group by ords.TRACKING_NUM 
having count(distinct ords.ORDER_NUM) = 4 

voglio che per recuperare la quantità totale di TRACKING_NUMs che hanno 4 ORDER_NUMs su di loro (dovrebbe essere 3.352). Invece ottengo 3.352 righe pari a 4 (o più a causa del distinto).

Capisco perché questo sta accadendo. Sta contando i valori all'interno di ogni gruppo di. E posso facilmente modificare la query a questo:

select ords.TRACKING_NUM 
from Orders ords (NoLock) 
group by ords.TRACKING_NUM 
having count(distinct ords.ORDER_NUM) = 4 

e poi ottenere 3.352 file di TRACKING_NUMs tornati a me. Tuttavia, questo non è molto performante nel mio database (richiede circa 41 secondi). Quello di cui ho veramente bisogno è una query che mi dia un conteggio e solo un conteggio (e facendo ciò si spera vada più veloce).

Grazie per eventuali suggerimenti.

risposta

13
SELECT COUNT(*) 
FROM (
    SELECT TRACKING_NUM 
    FROM Orders 
    GROUP BY TRACKING_NUM 
    HAVING count(distinct ORDER_NUM) = 4) AS Agg 
+0

L'esecuzione di questo in SSMS restituisce il seguente errore: Msg 170, livello 15, stato 1, riga 7 Riga 7: sintassi errata vicino a ")". – Vaccano

+0

Se lo eseguo in ApexSQL Edit ottengo questo errore: Msg 156, livello 15, stato 1, in linea: 10 Sintassi errata vicino alla parola chiave 'set'. – Vaccano

+0

Sì, le tabelle derivate richiedono un alias –

2
SELECT OrderCount AS 'Total Orders', COUNT(TRACKING_NUM) AS 'Tracking Num Count' 
FROM (
    SELECT DISTINCT TRACKING_NUM, COUNT(DISTINCT ORDER_NUM) AS 'OrderCount' 
    FROM Orders 
    GROUP BY TRACKING_NUM 
) AS tblOrdersPerTrackingNum 

Questo ti porterà solo i conteggi per le TRACKING_NUMs come si voleva, e anche ottenere i conteggi per ogni altra quantità di ordini totali (non solo avere conteggio ordine = 4).

(Sembra che la tua query riguardi una sorta di rapporto - se questo è il caso, e se verrà eseguito spesso dove la prestazione è una preoccupazione, come hai suggerito - potresti anche ottenere tutto il tuo valori da una query, invece di modificare o parametrizzare il conteggio a cui sei interessato e rieseguire più volte (anche se questo è stato automatizzato). Molto meglio lasciare che il server faccia tutto per te una volta. Perdona il mio assunto se quello non è quello a cui stavate lavorando.)

So che non è esattamente quello che stavi chiedendo ... Remus Rusanu lo ha già risolto, ma hai chiesto "qualche suggerimento".

Problemi correlati