DB2 SQL 比 SUM+CASE 更好的方法来获取基于 ID 的唯一值计数

Posted

技术标签:

【中文标题】DB2 SQL 比 SUM+CASE 更好的方法来获取基于 ID 的唯一值计数【英文标题】:DB2 SQL better way to get count of unique values based on ID than SUM+CASE 【发布时间】:2018-08-08 22:28:36 【问题描述】:

我能够计算同一记录中每个 ID 的唯一值的出现次数,但似乎必须有更有效的方法? COUNT([Value],'2') 之类的东西?

这是一个简单的例子

ID | Value
 1      2
 1      3
 1      3
 1      2
 2      2
 2      3
 2      3
 3      3

这是我当前的代码:

SELECT ID, SUM(CASE WHEN Value = '2' THEN 1 ELSE 0 END) AS "COUNT2", 
SUM(CASE WHEN Value = '2' THEN 1 ELSE 0 END) AS "COUNT3"
FROM TABLE
GROUP BY ID

结果是:

ID | Count2 | Count3
 1      2        3
 2      1        2
 3      0        1

有没有更好的方法来获取唯一值的计数?

【问题讨论】:

这个方法很好。 以什么方式更好?如果您希望像示例中那样“旋转”输出,那么您的代码就是最好的解决方案。我想您可以将 CASE 隐藏在 UDF 中,但如果不编写自己的用户定义聚合函数,您仍然需要 SUM 【参考方案1】:

试试:

Select distinct Id, Count2, Count3
from Table 
Outer Apply (select count(id) as Count2 from table t 
             where t.id = Table.id and value = 2) c2
Outer Apply (select count(id) as Count3 from table t 
             where t.id = Table.id and value = 3) c3
Order by Id asc

从我的手机输入,所以可能需要稍微调整一下,但这样的东西应该可以工作

【讨论】:

【参考方案2】:

你可以使用DECODE,如果“更好”意味着更简洁

WITH I (ID, V) AS (VALUES 
  (1,2)
, (1,3)
, (1,3)
, (1,2)
, (2,2)
, (2,3)
, (2,3)
, (3,3)
)
SELECT
    ID
,   COUNT(DECODE(V,2,1)) AS "Count2"
,   COUNT(DECODE(V,3,1)) AS "Count3"
FROM I
GROUP BY
    ID

返回

 ID Count2 Count3
 -- ------ ------
  1      2      2
  2      1      2
  3      0      1

【讨论】:

【参考方案3】:

如果您使用的是 Db2 LUW 11.1.1.1 及更高版本,则可以利用 SUM BOOLEAN 值这一事实。

WITH I (ID, V) AS (VALUES 
  (1,2)
, (1,3)
, (1,3)
, (1,2)
, (2,2)
, (2,3)
, (2,3)
, (3,3)
)
SELECT
    ID
,   SUM(V=2) AS "Count2"
,   SUM(V=3) AS "Count3"
FROM I
GROUP BY
    ID

【讨论】:

以上是关于DB2 SQL 比 SUM+CASE 更好的方法来获取基于 ID 的唯一值计数的主要内容,如果未能解决你的问题,请参考以下文章

iSeries DB2 SQL - 使用 CASE 语句更新 UDF 中的变量

有没有比在开头使用 1=1 更好的方法来动态构建 SQL WHERE 子句?

带有 CASE 条件和 SUM() 的 SELECT 查询

SQL:有没有比“COALESCE on two selects”更好的方法来查找 OR 子句中的第一个非空结果?

SQL DB2 - 可以缩短长期列出的“case when”语句吗?

CASE 语句 SQL 中返回多列