2017-02-15 1 views
2

Ich habe die folgende Abfrage:SUM auf der Basis verschiedenen Typen

SELECT 
    ISNULL(DrugName,'Sub Total:') as Drug, 
    SUM(COUNT) as Count, 
    Percentage 
FROM 
(
    SELECT 
     DrugName, 
     DrugCategoryName, 
     COUNT(*) as Count, 
     CONVERT(DECIMAL(10,2),COUNT(*) * 100.0/SUM(COUNT(*)) over()) as Percentage 
     FROM 
     Visit V 
    INNER JOIN Drug D on 
     V.DrugID = D.DrugID 
    INNER JOIN DrugCategory DC on 
     D.DrugCategoryID = DC.DrugCategoryID 
    GROUP BY GROUPING SETS 
     ((DrugName, DrugCategoryName)) 
) a 
GROUP BY GROUPING SETS 
    ((DrugName, DrugCategoryName, Percentage), (DrugCategoryName)) 

, die folgenden Ergebnisse erzielt:

Drug       Count Percentage 
Amphetamines     401 4.24 
Benzodiazapine     435 4.60 
Biodone       459 4.85 
Sub Total:      1295 NULL 
Brown Heroin     436 4.61 
Buprenorphine     396 4.18 
Cocaine       444 4.69 
Did not inject     404 4.27 
Endone       450 4.75 
Fentanyl Patch     404 4.27 
Heroin       1365 14.42 
Heroin & Cocaine    448 4.73 
Ice/Crystal/Meth    889 9.39 
Sub Total:      5236 NULL 
Kapanol       427 4.51 
Methadone      430 4.54 
Methadone Syrup     394 4.16 
Morphine      417 4.41 
MS Contin      438 4.63 
MS Mono       424 4.48 
Other Amphetamines    404 4.27 
Sub Total:      2934 NULL 

Was ich brauche auch zu tun ist, um die Zwischensumme Prozent berechnen, so Zum Beispiel ist die erste Untersumme 1295, also würde ein Prozentsatz basierend auf 1295 + 5236 + 2934 berechnet und ein Wert von 13,68% erhalten, usw. für die anderen Untersummenzeilen.

Wie könnte dies dynamisch geschehen, also wird es unabhängig von der Anzahl der Subsummen korrekt berechnet?

+0

haben Sie SELECT ISNULL (DrugName versuchte dabei, 'Total:') als Drug, SUM (COUNT) als Count, SUM (Prozent)/SUM (COUNT) AS perc ... dann alle wie vorher – Cato

+0

Ja, ich danke @Cato - nicht gut. – Philip

+0

Sie werden dort eine 'Order by DrugCategoryName' brauchen. – shawnt00

Antwort

1
WITH CTE AS 
(
SELECT 
    ISNULL(DrugName,'Sub Total:') as Drug, 
    SUM(COUNT) as Count, 
    Percentage 
FROM 
(
    SELECT 
     DrugName, 
     DrugCategoryName, 
     COUNT(*) as Count, 
     CONVERT(DECIMAL(10,2),COUNT(*) * 100.0/SUM(COUNT(*)) over()) as Percentage 
     FROM 
     Visit V 
    INNER JOIN Drug D on 
     V.DrugID = D.DrugID 
    INNER JOIN DrugCategory DC on 
     D.DrugCategoryID = DC.DrugCategoryID 
    GROUP BY GROUPING SETS 
     ((DrugName, DrugCategoryName)) 
) a 
GROUP BY GROUPING SETS 
    ((DrugName, DrugCategoryName, Percentage), (DrugCategoryName))) 

     SELECT [DRUG],[COUNT] ,ISNULL([PERCENTAGE],([COUNT]/S)*100) AS [PERCENTAGE] FROM CTE A CROSS APPLY 
    (SELECT CAST(SUM([COUNT])AS NUMERIC(22,6)) AS S FROM CTE B WHERE DRUG='SUB TOTAL:')C 

OUTPUT

DRUG COUNT PERCENTAGE 
Amphetamines 401 4.240000 
Benzodiazapine 435 4.600000 
Biodone 459 4.850000 
Sub Total: 1295 13.681986 
Brown Heroin 436 4.610000 
Buprenorphine 396 4.180000 
Cocaine 444 4.690000 
Did not inject 404 4.270000 
Endone 450 4.750000 
Fentanyl Patch 404 4.270000 
Heroin 1365 14.420000 
Heroin & Cocaine 448 4.730000 
Ice/Crystal/Meth 889 9.390000 
Sub Total: 5236 55.319599 
Kapanol 427 4.510000 
Methadone 430 4.540000 
Methadone Syrup 394 4.160000 
Morphine 417 4.410000 
MS Contin 438 4.630000 
MS Mono 424 4.480000 
Other Amphetamines 404 4.270000 
Sub Total: 2934 30.998415 
+0

Danke @Chanukya, das sieht gut aus, aber möglich, das in die ursprüngliche Abfrage zu integrieren? – Philip

+0

@James von meinem Verständnis bitte setzen Sie Ihr Ergebnis cte und danach können Sie verwenden, wie ich es tat – Chanukya

+0

Fair genug. Ich würde gerne sehen, ob das im Idealfall vermeidbar ist. – Philip

0

Ich denke, man kann nur die Summe in der Unterabfrage und dividieren berechnen:

SELECT COALESCE(DrugName, 'Sub Total:') as Drug, 
     SUM(COUNT) as Count, 
     SUM(COUNT)/total_cnt as Percentage 
FROM (SELECT DrugName, DrugCategoryName, 
      COUNT(*) as Count, 
      CONVERT(DECIMAL(10,2), COUNT(*)) * 100.0/SUM(COUNT(*)) over() as Percentage, 
      SUM(1.0*COUNT(*)) OVER() as total_cnt 
     FROM Visit V INNER JOIN 
      Drug D 
      ON V.DrugID = D.DrugID INNER JOIN 
      DrugCategory DC 
      ON D.DrugCategoryID = DC.DrugCategoryID 
     GROUP BY DrugName, DrugCategoryName 
    ) vd 
GROUP BY GROUPING SETS ((DrugName, DrugCategoryName, Percentage, Total_cnt), 
         (DrugCategoryName, Total_Cnt)) 
+0

Danke @ Gordon Linoff. Es Fehler obwohl leider: Msg 130, Ebene 15, Status 1, Zeile 7 Kann eine Aggregatfunktion für einen Ausdruck, der ein Aggregat oder eine Unterabfrage enthält, nicht ausführen. – Philip

+0

Welche Version von SQL Server verwenden Sie? Ich konnte es zur Arbeit bringen: http://rexttester.com/FEZT88753 – shawnt00

+0

@ shawnt00 - wenn ich dein Beispiel versuche, ist die Prozentsatz Spalte 0? Verwenden einer MSDN SQL Azure-Instanz – Philip

Verwandte Themen