[英]SQL getting counts for several rows grouped by a column
我正在嘗試為每一列計算多個單獨的行。 以下是我要完成的示例。
select (select top 1 name
from chap
where chap.chp_id = CHS.chp_id) as Chap,
(select count(*)
from CHS,
chap
where O_TYPE = 'PRESIDENT'
and chs.chp_id = chap.chp_id) as Presidents,
(select count(*)
from CHS
where O_TYPE = 'VICEPRESIDENT') as VicePresidents,
(select count(*)
from CHS
where OFFICER_TYPE = 'CORRSECRETARY') as CorrespondinSecretaries,
(select count(*)
from CHS
where O_TYPE = 'RECORDINGSECRETARY') as RecordingSecretaries,
(select count(*)
from CHS
where O_TYPE = 'TREASURER') as Treasurers,
(select count(*)
from CHS
where O_TYPE = 'ADVISOR'
and ADV_CODE = 'B') as ChiefAdvisors,
(select count(*)
from CHS
where O_TYPE = 'ADVISOR'
and ADV_CODE <> 'B') as ChiefAdvisors
from CHS
where O_TYPE in ('PRESIDENT', 'VICEPRESIDENT', 'CORRSECRETARY', 'RECORDINGSECRETARY', 'TREASURER', 'ADVISOR')
and Term_expire >= DateAdd(Day,DateDiff(Day,0,GetDate()),0)
and Term_Begin <= DateAdd(Day,DateDiff(Day,0,GetDate()),0)
and CHS.CHP_ID in (Select chp_id
from chrs
where active = 'Y')
Group by chs.CHP_ID
當我運行它時,它會將所有記錄總計在每一行中,而不僅僅是該章的記錄。 有什么建議么?
輸出范例
AL A 247 264 247 250 246 235 739
AL B 247 264 247 250 246 235 739
AL G 247 264 247 250 246 235 739
AL D 247 264 247 250 246 235 739
AK A 247 264 247 250 246 235 739
AZ A 247 264 247 250 246 235 739
AZ B 247 264 247 250 246 235 739
AZ G 247 264 247 250 246 235 739
我真正想要的是
AL A 1 1 1 4 8 9 16
AL B 1 1 5 7 8 9 21
考慮將所有子查詢替換為具有第一名稱的計算列,只需將其作為主表的JOIN
。 對於計數,通過對條件求和來使用條件聚合。 此外,調整GROUP BY
以包括名稱而不是唯一ID,這可能是重復數據的原因。 另外,在WHERE
檢查學期日期范圍,因為它們似乎是多余的。
SELECT chap.name AS Chap,
SUM(O_TYPE = 'PRESIDENT') AS Presidents,
SUM(O_TYPE = 'VICEPRESIDENT') AS VicePresidents,
SUM(OFFICER_TYPE = 'CORRSECRETARY') AS CorrespondingSecretaries,
SUM(O_TYPE = 'RECORDINGSECRETARY') AS RecordingSecretaries,
SUM(O_TYPE = 'TREASURER') AS Treasurers,
SUM(O_TYPE = 'ADVISOR' AND ADV_CODE = 'B') AS ChiefAdvisors,
SUM(O_TYPE = 'ADVISOR' AND ADV_CODE <> 'B') AS OtherAdvisors
FROM chap
INNER JOIN CHS ON chap.chp_id = CHS.chp_id
INNER JOIN chrs ON CHS.CHP_ID = chrs.CHP_ID AND active = 'Y'
WHERE O_TYPE IN ('PRESIDENT', 'VICEPRESIDENT', 'CORRSECRETARY',
'RECORDINGSECRETARY', 'TREASURER', 'ADVISOR')
AND Term_expire >= DATEADD(Day, DATEDIFF(Day, 0, GETDATE()), 0)
AND Term_Begin <= DATEADD(Day, DATEDIFF(Day, 0, GETDATE()), 0)
GROUP BY chap.name
有條件的聚合應該做您想要的。 在SQL Server中,我將其表述為:
SELECT chap.name AS Chap,
SUM(CASE WHEN chs.O_TYPE = 'PRESIDENT' THEN 1 ELSE 0 END) AS Presidents,
SUM(CASE WHEN chs.O_TYPE = 'VICEPRESIDENT' THEN 1 ELSE 0 END) AS VicePresidents,
SUM(CASE WHEN chs.OFFICER_TYPE = 'CORRSECRETARY' THEN 1 ELSE 0 END) AS CorrespondingSecretaries,
SUM(CASE WHEN chs.O_TYPE = 'RECORDINGSECRETARY' THEN 1 ELSE 0 END) AS RecordingSecretaries,
SUM(CASE WHEN chs.O_TYPE = 'TREASURER' THEN 1 ELSE 0 END) AS Treasurers,
SUM(CASE WHEN chs.O_TYPE = 'ADVISOR' AND ADV_CODE = 'B' THEN 1 ELSE 0 END) AS ChiefAdvisors,
SUM(CASE WHEN chs.O_TYPE = 'ADVISOR' AND ADV_CODE <> 'B' THEN 1 ELSE 0 END) AS OtherAdvisors
FROM chap JOIN
CHS
ON chap.chp_id = CHS.chp_id JOIN
chrs
ON CHS.CHP_ID = chrs.CHP_ID AND
WHERE chrs.active = 'Y' AND
chap.O_TYPE IN ('PRESIDENT', 'VICEPRESIDENT', 'CORRSECRETARY',
'RECORDINGSECRETARY', 'TREASURER', 'ADVISOR'
) AND
chap.Term_expire >= CONVERT(DATE, GETDATE()) AND
chap.Term_Begin <= CONVERT(DATE, GETDATE())
GROUP BY chap.name;
請注意,這還可以限定所有列名並簡化日期算術。
請嘗試以下方法:
SELECT chap.Name AS [Chap]
,SUM(IIF(chs.O_TYPE = 'PRESIDENT',1,0)) AS [Presidents]
,SUM(IIF(chs.O_TYPE = 'VICEPRESIDENT',1,0)) AS [VicePresidents]
,SUM(IIF(chs.O_TYPE = 'CORRSECRETARY',1,0)) AS [CorrespondinSecretaries]
,SUM(IIF(chs.O_TYPE = 'RECORDINGSECRETARY',1,0)) AS [RecordingSecretaries]
,SUM(IIF(chs.O_TYPE = 'TREASURER',1,0)) AS [Treasurers]
,SUM(IIF(chs.O_TYPE = 'ADVISOR' AND chs.ADV_CODE = 'B',1,0)) AS [ChiefAdvisorsB]
,SUM(IIF(chs.O_TYPE = 'ADVISOR' AND chs.ADV_CODE <> 'B',1,0)) AS [ChiefAdvisorsNotB]
FROM chs
INNER JOIN chrs ON chrs.CHP_ID = chs.CHP_ID AND chrs.Active = 'Y' /*works as filter*/
INNER JOIN chap ON chap.CHP_ID = chs.CHP_ID
WHERE chs.O_TYPE IN ('PRESIDENT', 'VICEPRESIDENT', 'CORRSECRETARY', 'RECORDINGSECRETARY', 'TREASURER', 'ADVISOR')
AND DATEADD(DAY,DATEDIFF(DAY,0,GETDATE()),0) BETWEEN chs.Term_Begin AND chs.Term_expire
GROUP BY chap.Name
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.