2012-05-01 31 views
7

Mam tabelę raportów, które zawierają pola Case (unikalny numer), ISR (indywidualny raport bezpieczeństwa - unikalny numer) i YearsOld.LICZENIE DISTINCT w SELECT CASE SQL

Dla każdego przypadku może być więcej niż jeden kod ISR. Chcę policzyć liczbę unikalnych przypadków w grupach wiekowych.

Ten SQL daje mi zliczania liczby reakcji w miejscu wstrzyknięcia:

SELECT 
COUNT(CASE WHEN `YearsOld` = -2) THEN 1 END) `No Report`, 
COUNT(CASE WHEN `YearsOld` BETWEEN 0 AND 5) THEN 1 END) `0 to 5` 
COUNT(CASE WHEN `YearsOld` BETWEEN 6 AND 12) THEN 1 END) `6 to 12` 
FROM `Demographics` 

czy istnieje sposób zmodyfikować ten policzyć DISTINCT Cases dla tych grup wiekowych?

+0

zawsze istnieje możliwość, ale co jeśli sprawa obejmuje osobę w wieku 5-6 lat. Czy chcesz, aby liczba była w zakresie, w którym sprawa się rozpoczęła, lub przypadek, w którym dana osoba jest powiązana z ostatnią aktywnością. – DRapp

+0

Czy 'Case' może mieć różne lata' YearsOld' dla różnych 'ISR'? – eggyal

+0

Tak. ISR jest indywidualnym raportem bezpieczeństwa dotyczącym niepożądanej reakcji na lek. Może wystąpić więcej niż jeden ISR w przypadku określonego incydentu (zgłoszonego przez dwóch lub więcej dziennikarzy) i może istnieć więcej niż jeden ISR w tym samym Przypadku zdarzeń niepożądanych, które spotkały go w różnych datach. Idealnie, Case + DateOfEvent + YearsOld będą używane do zliczania dokładnej liczby Niekorzystnych zdarzeń, które miały miejsce w Przypadku w danym wieku, ale Data wydarzenia jest często pomijana w raportach, więc Case + YearsOld jest tak blisko, jak tylko mogę dostać zliczać unikalne Case + AdverseEvents. Twoje rozwiązanie poniżej działa świetnie. –

Odpowiedz

8

Jeśli zmienna „przypadek” jest wyjątkowy, z pewnością można umieścić DISTINCT w SQL CASE składni bezpośrednio:

Count(distinct CASE when yearsold between 6 and 12 then case else null end) 

W ten sposób, każdy wyjątkowy wartość zmiennej przypadek jest liczony tylko raz.

Tylko uwaga na temat nazewnictwa kolumn, sugerowałbym nie używać słowa, które ma znaczenie w SQL, jeśli masz wybór (tj. Użyj "case_num" zamiast sprawy).

+0

Dzięki, zgadzam się na twoją notatkę; 'Case' to nazwa pola w istniejącej tabeli. –

4

Można użyć podzapytania filtrować tabelę demograficzne dla pojedynczego YearsOld polu na razie, chociaż jeśli to sprawa może mieć związek z wieków różnicy na innej ISR to będzie w końcu jest liczony tylko w jednym wsporniku (może to to, co chcesz):

SELECT 
    ... -- as you currently have 
FROM (
    SELECT `Case`, `YearsOld` from `Demographics` GROUP BY `Case` 
) t; 

Alternatywnie, do „liczyć” każdego „wyraźną” „przypadek” w każdym wsporniku, robisz dosłownie, że:

SELECT 
    COUNT(DISTINCT CASE WHEN `YearsOld` = -2 THEN 1 END) `No Report`, 
    COUNT(DISTINCT CASE WHEN `YearsOld` BETWEEN 0 AND 5 THEN `Case` END) `0 to 5`, 
    COUNT(DISTINCT CASE WHEN `YearsOld` BETWEEN 6 AND 12 THEN `Case` END) `6 to 12` 
FROM Demographics; 
+0

Dzięki, to działa. Chcę policzyć DISTINCT 'Case' +' YearsOld', który to robi doskonale. –