2017-09-15 1 views
1

Ich habe eine ziemlich große Abfrage, die ich verwende, um Daten aus der DB zu erhalten. Ich frage mich, ob es für mich möglich ist, am Ende aller Daten eine Zeile hinzuzufügen, die eine Summe aller Spalten mit Ausnahme der ersten enthält.Einschließlich einer TOTAL-Zeile in einer SQL-Abfrage

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 

so dass diese Abfragebefehl liefert Daten, die wie folgt aussieht:

enter image description here

Also nichts verrückt, mit Ausnahme der ersten Spalte REQUESTOR, es ist alle Zahlen, immer zu gehen> 0 oder 0, keine NULL.

Jetzt möchte ich eine TOTAL-Zeile in der REQUESTOR-Spalte hinzufügen, und dann im Grunde genommen alle verbleibenden Spalten nehmen. Ist so etwas machbar?

+0

, wie ich die Gruppierungsmengen - nicht allzu klar – BobSki

Antwort

2

Verwendung grouping sets:

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

wie ich die Gruppierung Sätze verwenden - nicht zu klar mache ich eine Union ALL müssen? Wie bekomme ich die Zeile 'TOTAL'? – BobSki

+1

@Bobski die Syntax ist * genau * das gleiche wie eine normale Gruppe von, aber anstelle von 'Gruppe von ProviderName' geben Sie den Code Gordon angegeben. – Xedni

+0

Wie kann ich den TOTAL-Zeilentext unter dem letzten ProviderName hinzufügen? @Xedni – BobSki

0

Gerade da mein Kommentar auf Gordon Antwort war ein wenig langwierig bekommen, ich dachte, dass ich etwas von diesem mit einigen Beispieldaten zusammenfassen würde.

;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), 
    () 
) 

Es gibt ein paar andere Möglichkeiten, wie Sie dies auch tun könnte, aber ich, was die grouping sets ist die klarste und am meisten übertragbar auf andere Situationen. Das heißt, hier ist eine andere Möglichkeit, wie Sie es tun könnten. Da die Gesamtzeile einen Null-Provider-Namen haben wird, könnten Sie einfach eine ISNULL tun. Der Grund, den ich vorschlagen, ist, dass, wenn Sie mehr als eine Spalte in Ihrem group by haben, Sie sowieso die grouping() Funktion verwenden sollten, also ist es eine bessere Angewohnheit, hineinzugehen.

Die with rollup Option tut genau das; rollt eine zusätzliche Gesamtreihe auf. Ich glaube mich zu erinnern, irgendwo gelesen oder gehört zu haben, dass with rollup nicht ideal war, obwohl TBH ich mich nicht erinnern kann, warum.

;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 
Verwandte Themen