2013-02-04 15 views
6

Bir sütunda belirli bir değerin sayımlarını döndürmek için doğru SQL sözdizimi ile mücadele ediyorum.SQL sorgusu - iç içe geçmiş SELECT sorgusundaki farklı değerlerle aynı sütunda birden fazla COUNT

Bu sorgu (2008 mutlu görünüyor muhtemelen yanlış sözdizimi, ancak SQL Server) Elbette

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 
) 

, hem Late ve Absent sütunlar çünkü 'nerede' olduğu aynı değerleri döndürür çalışır.

Peki bu, "Yılın 10" üyesi olan öğrencilerin kimliklerini belirleyerek (sağdan) yapmanın ne olduğunu.

Öyleyse, her bir öğrenci kimliği için, onaylanmayan devamsızlık türü 1 ve bir sonraki sütunda kaydedilen onaylanmamış devamsızlıkların sayımını döndürmek için ona ihtiyacım var, ayrıca türün 2 olduğu onaylanmamış devamsızlıkların sayısını da döndür.

ben şöyle sorgusu göndermek için çalışırsanız

: -

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 çatlatır ve kırmızı neredeyse tüm sorguyu altını çizmektedir.

Ben şu üç sütunu sona gerekir: -

StudentID | Late | Absent

Ve uygun sayımları ile öğrenci kimliklerini sahip üç sütun.

Çoğu temel seçim sorgusunu yapabilirim, ancak iç içe geçmiş sorgular, sendikalar, birleşimler, iç içe girenler söz konusu olduğunda, derinliklerimin dışındayım. Herhangi bir yardım en çok takdir edilecektir. Hiçbir şekilde (çalışma) sorgumun herhangi bir şekilde doğru bir şekilde yapılandırıldığından emin değilim, çünkü bu konuda bir hack.

cevap

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