2009-07-22 8 views
8

Qui di seguito è una query SQL che ho scritto per trovare il numero totale di righe per ciascun ID prodotto (proc_id):SQL COUNT (*) e del Gruppo By - Trova differenza tra le righe

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
ORDER BY proc_id; 

seguenti è il risultato di la query SQL sopra:

 
proc_id count(*) 
01 626 
02 624 
03 626 
04 624 
05 622 
06 624 
07 624 
09 624

Avviso i conteggi totali da proc_id = '01', proc_id = '03', e proc_id = '05' sono diversi (non uguale a 624 righe come l'altra proc_id).

Come scrivere una query SQL per trovare quali righe proc_id sono diverse per proc_id = '01', proc_id = '03' e proc_id = '05' rispetto all'altro proc_id?

+0

Se ho compreso correttamente la tua domanda, abbiamo bisogno di ulteriori informazioni sulla struttura del resto della tabella per produrre tutto ciò che ha senso. – Thorarin

risposta

2

Se si conosce 624 è il numero magico:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> 624 
ORDER BY proc_id; 
14

In primo luogo è necessario definire i criteri che fa '624' corretto. È la media count(*)? È il count(*) che si verifica più spesso? È il tuo preferito count(*)?

Quindi è possibile utilizzare la clausola dover separare quelli che non corrispondono ai vostri criteri:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> 624 
ORDER BY proc_id; 

o:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> (
    <insert here a subquery that produces the magic '624'> 
) 
ORDER BY proc_id; 
+3

+1 a causa della sottoquery –

0

provare questo:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> (select count(*) from proc z where proc_id in (1) group by proc_id) 
ORDER BY proc_id; 
0

È non posso farlo Per alcuni procedi ci sono meno righe con quel ProcId. In altre parole, le righe che fanno che procId non abbia un conteggio = 624 sono righe che NON ESISTE. Come può una query mostrare quelle righe?

Per i ProcId che hanno troppe righe, IF (e questo è grande se), SE tutte le righe nel 624 per altri proclami hanno qualche attributo che è in comune con un sottoinsieme di conteggio 624 dei set che sono troppo grande, quindi potresti essere in grado di identificare le righe "extra", buit non c'è modo di identificare le righe mancanti, tutto quello che puoi fare è identificare quali procedi hanno troppe righe o troppo poche ...

0

Se capisco la tua domanda correttamente (che è diversa dalle altre risposte postate) vuoi le righe che rendono diverso il proc_id 01? In tal caso, è necessario unirsi a tutte le colonne che dovrebbero essere uguali e cercare le differenze. Così, per confrontare 01 con 02:

SELECT [01].* 
FROM (
    SELECT * FROM proc 
    WHERE grouping_primary = 'SLB' 
    AND eff_date = '01-JUL-09' 
    AND proc_id = '01' 
) as [01] 
FULL JOIN (
    SELECT * FROM proc 
    WHERE grouping_primary = 'SLB' 
    AND eff_date = '01-JUL-09' 
    AND proc_id = '02' 
) as [02] ON 
    [01].col1 = [02].col1 
    AND [01].col2 = [02].col2 
    AND [01].col3 = [02].col3 
    /* etc...just don't include proc_id */ 
WHERE 
    [01].proc_id IS NULL --no match in [02] 
    OR [02].proc_id IS NULL --no match in [01] 

sono abbastanza sicuro MS Sql Server dispone di una funzione di hash fila che possono rendere più facile se si dispone di un gruppo di colonne ... ma non riesco a pensare a il nome di esso.

+0

eccetto che, come comprendo la domanda, non sono i valori della colonna che lo rendono diverso, ma semplicemente il conteggio delle righe con quel procId ... indipendentemente dai valori della colonna - –

+0

CHECKSUM è il funzione di hash di riga magica –

0

Bene, per trovare l'extra si usa la frase NOT IN. Per trovare le righe mancanti è necessario invertire la logica. Ciò presuppone naturalmente che tutte le 624 righe siano uguali da proc_id a proc_id.

SELECT proc_id, varying_column 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
AND varying_column NOT IN (SELECT b.varying_column 
          FROM proc b 
          WHERE b.grouping_primary = 'SLB' 
          AND b.eff_date = '01-JUL-09' 
          AND b.proc_id = (SELECT FIRST a.proc_id 
               FROM proc a 
               WHERE a.grouping_primary = 'SLB' 
               AND a.eff_date = '01-JUL-09' 
               AND COUNT(a.*) = 624 
               GROUP BY a.proc_id 
               ORDER BY a.proc_id;)) 
ORDER BY proc_id, varying_column;