SQL - 计数和百分比

Posted

技术标签:

【中文标题】SQL - 计数和百分比【英文标题】:SQL - count and percent 【发布时间】: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) - 它应该是一个常数 【参考方案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

此外,您需要考虑一个零除数会导致“除以零”错误

【讨论】:

感谢 gbn - 超级简单的解决方案!!!我必须乘以 100 - 所以我的解决方案看起来像这样 (1.0*count()/select)*100 AS percent... 很干净。非常感谢。 @jpmyob:您也可以乘以 100.0 以使其更简单。我应该先这样做。答案已更新【参考方案2】:

首先,检查您的查询是否有效并返回正确的值:

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)

【讨论】:

【参考方案3】:

您可以使用ROUND() 函数...

ROUND(..., 2) AS percent

或者只是乘以一个十进制值(即1.0)。您可能还需要包含 IFCASE(取决于您的 SQL 服务器)来绕过可能的零值

【讨论】:

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

以上是关于SQL - 计数和百分比的主要内容,如果未能解决你的问题,请参考以下文章

SQL:计算每个设备集连续出现相同值的所有记录并返回最高计数:百分比

列 SQL 百分比的总和

计算百分比和计数

带有计数和百分比的 expss mdset 表

如何计算 SQL 表中前一个数字的百分比?

每天按列和行、计数和百分比分组