2011-08-29 17 views
5

Ho una tabella che memorizza più articoli per uno stato e voglio ottenere il conteggio per ogni stato in base a condizioni specifiche. Ho scritto questa query:Case e conteggi in 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 

ma ottengo questo errore:

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

Quando ho aggiunto GROUP BY clausola Per State_ID, ho ottenuto in precedenza l'errore ancora per STATE_NAME, e quando ha aggiunto STATE_NAME a GROUP BY clausola, ho ottenuto errore per State_All, State_w, State_s.

Non ho una colonna denominata State_All, State_w, State_s nella mia tabella.

Come è possibile ottenere il conteggio in base a condizioni specifiche senza utilizzare CURSORS?

risposta

0

sarebbe questo risolvere il problema?

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

Hai solo cambiato il modo in cui le colonne sono alias. OP ha già provato GROUP BY – gbn

0

Si dovrebbe aggiungere entrambe le colonne alla fine della query:

GROUP BY State_ID, State_Name 
+0

ho detto quando ho aggiungi 'GROUP BY State_ID, State_Name' agian Ho ottenuto un errore per State_All, .... – Arian

+0

Non è stato chiaro dalla tua domanda, pensavo volessi dire che hai provato State_ID e poi hai provato lo State_Name. –

11

Eri sulla strada giusta.

Hai inserito la condizione all'interno del COUNT in questo modo. COUNT ignora i NULL (che è l'ELSE implicito in CASE), quindi conti solo le corrispondenze vere. È necessario anche il GRUPPO BY.

tuo errore deriva dall'uso di tipo 1 e di tipo 2 al di fuori del Conte

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

Ottimo lavoro è corretto a modo mio sarebbe un errore. Tieni presente cosa succede se type1 = 1 e type2 = 2 :) – JTWebMan

3

È possibile modificare Conte a SUM perché ogni risultato record 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