2013-02-04 19 views
6

Sono in difficoltà con la sintassi SQL corretta per restituire i conteggi di un valore particolare in una colonna.Query SQL: più COUNT sulla stessa colonna con valori diversi dalla query SELECT nidificata

Questa query funziona (sintassi probabilmente errata, ma SQL Server 2008 sembra felice)

SELECT StudentID, count(UnApproved)as Late, count(Unapproved) as Absent from results 
WHERE unapproved=1 and StudentID in 
    (
    SELECT studentid FROM [Results] 
    WHERE StudentYearLevel='10' and Date > 20130101) group by StudentID 
) 

Naturalmente, entrambe le Late e Absent colonne restituiscono gli stessi valori a causa del luogo in cui il 'dove' è.

Quindi, ciò che sta facendo è (da destra) determinare gli ID degli studenti membri di "Anno 10".

Quindi, per ogni ID studente restituito, è necessario restituire il conteggio delle assenze non approvate registrate in cui il tipo di assenza non approvata è 1 e nella colonna successiva, restituire anche il conteggio delle assenze non approvate in cui il tipo è 2.

Se provo a inviare la query in questo modo: -

SELECT StudentID, count(UnApproved)as Late where unapproved=2, count(Unapproved) as Absent from results 
where unapproved=1 and StudentID in 
    (
    SELECT studentid FROM [Results] where StudentYearLevel='10' and Date > 20130101 
) 
group by StudentID 

SQL Server crepe IT e sottolinea quasi l'intera query in rosso.

Ho bisogno di finire per queste tre colonne: -

StudentID | Late | Absent

E le tre colonne che hanno gli ID degli studenti con i conteggi del caso.

Posso fare la maggior parte delle query di selezione di base, ma quando si tratta di query annidate, unioni, join, interi, sono fuori dalla mia profondità. Qualsiasi aiuto sarebbe più apprezzato. In nessun modo sono sicuro che la mia query (funzionante) sia in qualche modo strutturata correttamente, 'perchè sono un hacker a questo.

risposta

21
SELECT StudentID, 
SUM(case when Unapproved =1 then 1 else 0 end) as Late, 
SUM(case when Unapproved =2 then 1 else 0 end) as Absent 
from results where 
StudentID in (SELECT studentid FROM [Results] where StudentYearLevel='10' and Date > 20130101) 
group by StudentID 
Problemi correlati