2009-07-22 15 views
8

Poniżej jest zapytanie SQL pisałem znaleźć całkowitą liczbę wierszy przez każdego ID Produktu (proc_id):SQL Count (*) i Grupa By - Znajdź różnicę między rzędami

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

Poniżej jest wynikiem zapytanie SQL powyżej:

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

Wskazówki całkowite zliczenia przez proc_id = '01', proc_id = '03' i proc_id = '05' są różne (nie równa 624 rzędach jak inne proc_id).

Jak napisać zapytanie SQL, aby znaleźć wiersze proc_id różnią się dla proc_id = '01', proc_id = '03' i proc_id = '05' w porównaniu do innych proc_id?

+0

Jeśli dobrze rozumiem twoje pytanie, potrzebujemy więcej informacji o strukturze reszty stołu, aby wyprodukować coś, co ma sens. – Thorarin

Odpowiedz

2

Jeśli wiesz 624 to magiczna liczba:

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

Najpierw trzeba określić kryteria, które sprawia, „624” poprawne. Czy to średnia count(*)? Czy najczęściej występuje count(*)? Czy to Twój ulubiony count(*)?

Następnie można użyć klauzuli HAVING, aby oddzielić te, które nie pasują do Twoich kryteriów:

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; 

czyli

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 z powodu podkwerendy –

0

spróbować tego:

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

You nie mogę tego zrobić. Dla niektórych procI jest mniej wierszy z tym ProcId. Innymi słowy, wiersze, które sprawiają, że procId nie ma liczby = 624 są wierszami, które NIE WYSTĄPIĄ. Jak każde zapytanie może wyświetlać te wiersze?

Dla ProcIds, które mają zbyt wiele wierszy, IF (i to jest duże jeśli), JEŚLI wszystkie wiersze w 624 dla innych procId mają jakiś atrybut, który jest wspólny z podzbiorem 624 zestawów, które są zbyt duże, wtedy możesz być w stanie zidentyfikować "dodatkowe" wiersze, buit, nie ma możliwości zidentyfikowania brakujących wierszy, wszystko co możesz zrobić, to określić, które procenty mają za dużo wierszy lub za mało ...

0

Jeśli rozumiem Twoje pytanie poprawnie (inaczej niż inne opublikowane odpowiedzi), które chcesz wiersze, które zrobić proc_id 01 różne? W takim przypadku musisz dołączyć do wszystkich kolumn, które powinny być takie same, i poszukać różnic. Tak więc, aby porównać 01 z 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] 

jestem całkiem pewny, MS SQL Server posiada funkcję skrótu, że rząd może ułatwić, jeśli masz kilka kolumn ... ale nie mogę myśleć jego nazwa.

+0

z tą różnicą, że jak rozumiem pytanie, to nie wartości kolumn powodują, że jest on inny, ale po prostu liczba wierszy z tym procId ... niezależnie od wartości kolumny - –

+0

CHECKSUM jest magiczna funkcja mieszania wierszy –

0

Cóż, aby znaleźć dodatkowe, użyłbyś wyrażenia NOT IN. Aby znaleźć brakujące wiersze, musisz odwrócić logikę. Naturalnie zakłada się, że wszystkie 624 wiersze są takie same od proc_id do 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;