2011-09-22 227 views
0

撞墙上得到一个数和总的SQL - 计数和百分比

我希望每个位置总套数和总在所有地点的百分比单个查询的百分比...

我得到了 - 正在返回一个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” 表明这一点 - 在 计数(I.ID)* 100.0/COUNT(*)() 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 
+0

你会得到什么错误? – gbn

+0

我不是DB2的负责人,但是对于大多数语言/系统,如果任何一个部门的一部分是double/float,则执行浮动分割。在这里调用这个最简单的方法是将等式的计数(I.ID)部分。 –

+0

你可以简化你的分母SELECT count(I2.ID)从项目I2 WHERE I2.LocID IN(36,38,39,40) - 它应该是一个常量 – StuartLC

回答

1

只需通过漂浮/十进制值乘

SELECT 
    count(I.ID) as count 
    ,L.ID 
    ,(
    100.0 * count(I.ID) 
    /
    (
     SELECT count(I2.ID) 
     FROM LOCATION L2 
     JOIN ITEM I2 ON I2.LocID = L2.ID 
     WHERE L2.ID = L1.ID 
    ) 
    ) 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 

而且,你需要考虑零除数给出“除以零”的错误

+0

感谢gbn - 超级简单的解决方案!我不得不乘以100 - 所以我的解决方案看起来像这样(1.0 * count()/ select)* 100 AS%... 很干净。非常感激。 – jpmyob

+0

@jpmyob:你也可以乘以100.0来简化它。我应该先做这件事。答案已更新 – gbn

1

首先,检查你的查询工作,并返回正确的价值观:

SELECT 
count(I.ID) as count 
,L.ID 
,(SELECT count(I2.ID) 
     FROM LOCATION L2 
     JOIN ITEM I2 ON I2.LocID = L2.ID 
     WHERE L2.ID IN (36,38,39,40) 
) 
FROM LOCATION L 
JOIN ITEM I ON I.LocID = L.ID 
WHERE L.ID IN (36,38,39,40) 
GROUP BY L.ID 

然后使用proper syntax为DB2铸造:

CAST(%Expression% AS data-type) 
0

您可以使用ROUND()功能...

ROUND(..., 2) AS percent 

或者只是乘以十进制值(即1.0)。你也可能想要包含一个IFCASE(取决于你的SQL服务器)以避开可能的零值

+0

您还应该将'count(I.ID)'乘以'100'来获得实际百分比,而不仅仅是小于1的数字。 –