[英]Including a TOTAL row in a SQL query
我有一个很大的查询,我从数据库中获取数据。 我想知道是否有可能在所有数据的末尾添加一行,这将需要除第一列外的所有列的总和。
SELECT
t2.ProviderName AS REQUESTOR,
COUNT(e.clientid) AS '# OF CHECKS',
(SUM(CASE WHEN (e.[Date] <= '6/1/2017' OR e.[Date] BETWEEN '6/1/2017' AND
'9/1/2017') AND CL.EligibilityStatus = 20
THEN 1
ELSE 0
END)) AS '# ELIGIBLE',
(SUM(CASE WHEN e.[Date]> '9/1/2017' OR EligibilityStatus = 21
THEN 1
ELSE 0
END)) AS '# NOTELIGIBLE',
(SUM(CASE WHEN e.MakeReferral = 110
THEN 1 ELSE 0
END)) as '# REFERRED',
(SUM(CASE WHEN e.makereferral = 111
THEN 1 ELSE 0
END)) AS '# NOT REFERRED',
'' as 'REASON:',
(SUM(CASE WHEN e.Reason = 60 AND e.MakeReferral = 111
THEN 1 ELSE 0
END)) AS 'Not on eligibility List',
(SUM(CASE WHEN e.reason = 61 AND e.MakeReferral = 111
THEN 1 ELSE 0
END)) AS 'Already Enrolled',
(SUM(CASE WHEN e.reason = 62 AND e.MakeReferral = 111
THEN 1 ELSE 0
END)) AS 'Follow-up Needed',
(SUM(CASE WHEN e.reason = 63 AND e.MakeReferral = 111
THEN 1 ELSE 0
END)) AS 'Medicaid Issue',
(SUM(CASE WHEN e.reason = 64 AND e.MakeReferral = 111
THEN 1 ELSE 0
END)) AS 'QMB',
(SUM(CASE WHEN e.reason = 65 AND e.MakeReferral = 111
THEN 1 ELSE 0
END)) AS 'Other'
FROM
tblBHH_ClientEligibility e
INNER JOIN
(SELECT
providerID, providerName
FROM
tblBHH_Providers
UNION ALL
SELECT
id, label
FROM
tblBHH_ReferenceData
WHERE
fldname = 'requestor') t2 ON e.Requestor = t2.ProviderID
INNER JOIN
tblBHH_Clients CL ON e.clientid = CL.ClientID
WHERE
e.[date] BETWEEN '6/1/2017' AND '9/1/2017'
GROUP BY
ProviderName
ORDER BY
ProviderName
因此,此查询产生的数据如下所示:
因此,除了第一列REQUESTOR之外,没有什么疯狂的了,它都是数字,总是> 0或0,没有NULL。
现在,我想在REQUESTOR列中添加TOTAL行,然后基本上将所有剩余的列合计。 这样可行吗?
使用grouping sets
:
group by grouping sets ( (ProviderName), () )
就在我对戈登答案的评论变得冗长的时候,我想我将使用一些样本数据来总结其中的一些内容。
;with data (ProviderName, Value) as
(
select 'AAA', 1 union all
select 'AAA', 3.14 union all
select 'BBB', 987
)
select
ProviderName = case when grouping(ProviderName) = 0 then ProviderName
else 'Total'
end,
Value = sum(Value)
from data
group by grouping sets
(
(ProviderName),
()
)
您也可以通过其他几种方式来执行此操作,但是我认为grouping sets
最清晰,并且最容易转移到其他情况。 就是说,这是您可以做的另一种方法。 由于总行的ProviderName为空,因此您可以执行ISNULL
。 我建议您这样做的原因是,如果您的group by
有多个列,则无论如何都必须使用grouping()
函数,因此这是一种更好的习惯。
with rollup
选项可以做到这一点。 汇总一个额外的总行。 我似乎记得从某个地方阅读或收听with rollup
并不理想的信息,尽管TBH我不记得为什么。
;with data (ProviderName, Value) as
(
select cast('AAA' as varchar(30)), 1 union all
select 'AAA', 3.14 union all
select 'BBB', 987
)
select
ProviderName = isnull(ProviderName, 'Total'),
Value = sum(Value)
from data
group by ProviderName
with rollup
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.