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