2013-05-10 97 views
0

所以我试图让具有条件(从查询的其余部分不同)的计数的总和获取计数的总和与条件

这是我到目前为止有:

SELECT studemo.ssid         AS [SSID], 
     stustat.graden        AS Grade, 
     studemo.lastname        AS [Last Name], 
     studemo.firstname       AS [First Name], 
     (SELECT Count(*) 
     WHERE attend.attendc IN ('E', 'G', 'H', 'I', 
            'J', 'L', 'M', 'P', 
            'Q', 'V', 'X')) AS [Days Absent], 
     attend.attendc        AS [Attendance Code], 
     attend.ddate         AS [Date] 
FROM track, 
     stustat, 
     stusched, 
     studemo, 
     attend 
WHERE studemo.suniq = stustat.suniq 
     AND attend.scduniq = stusched.scduniq 
     AND studemo.suniq = stusched.suniq 
     AND stustat.trkuniq = track.trkuniq 
     AND track.schoolc = '408' 
     AND track.schyear = '2013' 
     AND stustat.edate >= '08/21/2012' 
     AND stustat.xdate IS NULL 
ORDER BY [last name], 
      [first name], 
      attend.ddate 

这会给我正确的信息,只是不是我想要得到它的方式。它会给我一行每一个出席代码。我希望能做的就是加总从count(*)子查询中获得某些东西的次数。我尝试以大约100种不同的方式求和(),但我无法得到它。有什么建议么?

+1

展示样品输入和输出数据...它很难理解从这里... – 2013-05-10 18:08:39

+2

谈隐加入 – Kermit 2013-05-10 18:09:53

+1

谁像这样写代码? – 2013-05-10 18:14:38

回答

3

尝试更换行:

(select count(*) where attend.attendc IN ('E','G','H','I','J','L','M','P','Q','V','X')) AS [Days Absent], 

与窗函数:

sum(case when attend.attendc IN ('E','G','H','I','J','L','M','P','Q','V','X') then 1 else 0 end) over() as [Days Absent] 

也就是说天缺席的总数。我猜你想要这个SSID。在这种情况下,使用partition by

sum(case when attend.attendc IN ('E','G','H','I','J','L','M','P','Q','V','X') then 1 else 0 end) 
      over (partition by SSID) as [Days Absent] 
+0

这对SSID的分区非常合适。非常感谢! – m0ngr31 2013-05-10 18:26:49