2017-09-15 15 views
1

私はDBからデータを取得するために使用する非常に大きなクエリを持っています。私はすべてのデータの最後に行を追加することが可能かどうか疑問に思っています。最初の行を除いてすべての列の合計が必要です。SQLクエリにTOTAL行を含める

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 

だから、このようになります。このクエリ利回りデータ:

enter image description here

最初の列REQUESTORを除き、クレイジーので何も、それは常に> 0かになるだろう、すべての数字です0、NULLはありません。

ここでは、REQUESTOR列にTOTAL行を追加して、基本的に残りの列の合計を取ります。その行為のようなものですか?

+0

は、どのように私はグループ化セットを使用するには - あまりにもはっきりしていない – BobSki

答えて

2

使用grouping sets

group by grouping sets ((ProviderName),()) 
+0

は、どのように私はグループ化設定を使用する - 私は、UNION ALLを必要としない、あまりにも明確なのですか? 「TOTAL」行を取得するにはどうすればよいですか? – BobSki

+1

@Bobski構文は* by *通常のグループと同じですが、Group by ProviderNameの代わりにGordonが提供するコードを入力します。 – Xedni

+0

最後のProviderNameの下にTOTAL行のテキストを追加するにはどうすればよいですか? @Xedni – BobSki

0

ゴードンの答えに私のコメントが少し長くなっていただけであるため、私はいくつかのサンプルデータを使用して、この一部を要約しようと思いました。

;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は明確な、そして他の状況に最も譲渡であること。それは、あなたがそれを行うことができる別の方法があります。合計行にnull 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 
関連する問題