Sql 按不同类型求和

Sql 按不同类型求和,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下疑问: 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

我有以下疑问:

 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%的值,依此类推其他小计行


如何动态地进行此操作,以便无论小计的数量如何,都能正确地进行计算?

我认为您可以在子查询中计算总数并进行除法:

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

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

您是否尝试过使用SELECT ISNULL(DrugName,'Sub Total:')作为药物,SUM(计数)作为计数,SUM(百分比)/SUM(计数)作为百分比。。。那就跟以前一样是的,谢谢@Cato-不好。你需要一个
按药品类别的订单在里面。谢谢@Gordon Linoff。但不幸的是,它出现了错误:Msg 130,级别15,状态1,第7行无法对包含聚合或子查询的表达式执行聚合函数。您使用的SQL Server版本是什么?我能够让它工作:@shawnt00-当我尝试你的例子时,百分比列是0?使用MSDN SQL Azure实例。乘以1.0的目的是将结果转换为十进制值,这样就不会使用整数除法。你把那部分忘在里面了吗?显然,您没有使用任何实际数据进行测试,而且您报告的错误也消失了。消息156,第15级,状态1,第7行关键字“结束”附近语法不正确。如果有帮助的话,我可以发布一些实际数据。谢谢@Chanukya,这看起来很有效,但可以将其纳入原始查询吗?@James,据我所知,请将结果放入cte,然后您可以使用,因为我做得很公平。我想看看这在理想情况下是否可以避免。
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