2017-02-15 98 views
2

我有以下查詢:SUM基於不同類型

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)) 

其結果如下:

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 

什麼我也需要做的是計算小計百分比,所以例如第一個小計總計爲1295,因此計算基於1295 + 5236 + 2934的百分比並獲得13.68%的值,以此類推其他小計總計行。

這怎麼能動態完成,所以無論小計總量是多少,它都能正確計算出來?

+0

你嘗試過做SELECT ISNULL(DrugName, '小計:' )as Drug, SUM(COUNT)as Count, SUM(Percentage)/ SUM(COUNT)AS perc ...然後全部和以前一樣 – Cato

+0

是的,我感謝@Cato - 沒有好處。 – Philip

+0

您將需要在那裏通過DrugCategoryName'訂購。 – shawnt00

回答

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 

輸出

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

謝謝@Chanukya,看起來工作得很好,但可能將其納入原始查詢? – Philip

+0

@詹姆斯從我的理解,請把你的結果cte和之後,你可以像我一樣使用 – Chanukya

+0

公平的。我想看看這是否可以理想地避免。 – Philip

0

我想你可以只計算子查詢的總及分:

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

謝謝@Gordon Linoff。它錯誤,但不幸的是: 消息130,級別15,狀態1,行7 無法對包含聚合或子查詢的表達式執行聚合函數。 – Philip

+0

您使用的是哪個版本的SQL Server?我能夠得到它的工作:http://rextester.com/FEZT88753 – shawnt00

+0

@ shawnt00 - 當我嘗試你的例子百分比列是0?使用MSDN SQL Azure實例。 – Philip