2011-08-29 19 views
5

Mam tabelę, która przechowuje wiele elementów dla stanu i chcę uzyskać liczbę dla każdego stanu zgodnie z określonymi warunkami. Pisałem to zapytanie:Przypadek i liczba w SQL Server 2008

SELECT 
    State_ID, 
    State_Name, 
    State_All= CASE WHEN type1=1 AND type2=1 THEN COUNT(Id) END 
    State_w= CASE WHEN type1=2 AND type2=1 THEN COUNT(Id) END 
    State_s= CASE WHEN type1=2 AND type2=2 THEN COUNT(Id) END 
FROM 
    tblStates 

ale otrzymuję ten błąd:

Column 'State_ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

Kiedy dodałem GROUP BY klauzuli Dla state_id, mam powyżej błędu ponownie STATE_NAME, a po dodaniu STATE_NAME do GROUP BY klauzuli I Wystąpił błąd dla State_All, State_w, State_s.

Nie mam kolumna o nazwie State_All, State_w, State_s w mojej tabeli.

Jak mogę uzyskać liczbę zgodnie z określonymi warunkami bez używania CURSORS?

Odpowiedz

0

Czy to naprawić?

SELECT 
    State_ID, 
    State_Name, 
    CASE WHEN type1=1 AND type2=1 THEN COUNT(Id) END AS State_All, 
    CASE WHEN type1=2 AND type2=1 THEN COUNT(Id) END AS State_w, 
    CASE WHEN type1=2 AND type2=2 THEN COUNT(Id) END AS State_s 
FROM 
    tblStates 
GROUP BY State_ID, State_Name 
+0

Zmieniłeś tylko, jak kolumny są aliasami. OP już próbował GROUP BY – gbn

0

Należy dodać obie kolumny w końcu zapytania:

GROUP BY State_ID, State_Name 
+0

powiedziałem kiedy dodaj 'GROUP BY State_ID, State_Name' agian Mam błąd dla State_All, .... – Arian

+0

Nie było jasne z twojego pytania, Myślałem, że masz na myśli wypróbował State_ID, a następnie wypróbowane State_Name zamiast tego. –

11

Byłeś na dobrej drodze.

Umieszczasz warunek wewnątrz COUNT w ten sposób. COUNT ignoruje NULL (co jest domniemanym ELSE w CASE), więc liczymy tylko prawdziwe dopasowania. Potrzebujesz również GROUP BY.

Twój błąd pochodzi ze stosowania typu 1 i type2 poza COUNT

SELECT 
    State_ID, 
    State_Name, 
    State_All = COUNT(CASE WHEN type1=1 AND type2=1 THEN 1 END), 
    State_w = COUNT(CASE WHEN type1=2 AND type2=1 THEN 1 END), 
    State_s = COUNT(CASE WHEN type1=2 AND type2=2 THEN 1 END) 
FROM 
    tblStates 
GROUP BY 
    State_ID, State_Name 
+0

Świetna robota, jest poprawna, mój sposób by błąd. Pamiętaj, co jeśli typ1 = 1 i typ2 = 2 również :) – JTWebMan

3

można zmienić Hrabiego do SUM ponieważ każdy wynik Rekord 1

SELECT 
    State_ID, 
    State_Name, 
    State_All = SUM(CASE WHEN type1=1 AND type2=1 THEN 1 END), 
    State_w = SUM(CASE WHEN type1=2 AND type2=1 THEN 1 END), 
    State_s = SUM(CASE WHEN type1=2 AND type2=2 THEN 1 END) 
FROM 
    tblStates 
GROUP BY 
    State_ID, State_Name