繁体   English   中英

在SQL查询中包含TOTAL行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM