【发布时间】:2011-09-22 14:08:03
【问题描述】:
在单个查询中获得计数和总数的百分比时碰壁
我想要每个位置的 TOTAL 单位和 TOTAL Across all LOCATIONS 的百分比...
我得到的 - 返回一个 0(零)作为百分比 - 我相信我必须将数字转换为小数或实数类型 - 但无论我尝试什么(转换每个元素,或转换整个结果 - 我得到错误...)
SELECT
count(I.ID) as count
,L.ID
,(
count(I.ID)
/
( SELECT count(I2.ID)
FROM LOCATION L2
JOIN ITEM I2 ON I2.LocID = L2.ID
WHERE L2.ID IN (36,38,39,40) )
) AS percent
FROM LOCATION L
JOIN ITEM I ON I.LocID = L.ID
WHERE L.ID IN (36,38,39,40)
GROUP BY L.ID
关于如何返回小数的任何想法??? 或者只是让它更优雅..时期?
我会“期待”什么
ID COUNT PERCENT
2436 362 30.47
2438 184 15.48
2439 173 14.56
2440 172 14.47
2441 151 12.71
2442 54 4.54
2702 92 7.74
======== “t”建议这个 - count(I.ID) * 100.0 / count(*) over () AS 百分比 “over()”应该做什么?
这是回报:
ID COUNT PERCENT
2436 362 51
2438 184 26
2439 173 24
2440 172 24
2441 151 21
2442 54 7
2702 92 13
==========解决方案
SELECT
count(I.ID) as count
,L.ID
,(
1.0 * count(I.ID) / (
SELECT count(I2.ID)
FROM LOCATION L2
JOIN ITEM I2 ON I2.LocID = L2.ID
WHERE L2.ID = L1.ID )
) * 100 AS percent
FROM LOCATION L
JOIN ITEM I ON I.LocID = L.ID
WHERE L.ID IN (36,38,39,40)
GROUP BY L.ID
【问题讨论】:
-
我不是 DB2 负责人,但对于大多数语言/系统,如果除法的任何一部分是双精度/浮点数,则执行浮点除法。在这里调用它的最简单方法是转换等式的 count(I.ID) 部分。
-
您可以将分母简化为 SELECT count(I2.ID) FROM I2 WHERE I2.LocID IN (36,38,39,40) - 它应该是一个常数