SQL 将不同条件的多个计数作为新列

SQL multiple count for different condition as new column

我有两个表,每个表都有一个列 ID 和一个标志。 我想在一行中获取行数,其中 table2.id = 某些条件; 有了这个请求:

select table1.ID, table1.FLAG, count(1) row_count
from table1,
     table2
where table1.ID = 123
 and table1.ID = table2.ID
group by table1.ID, table1.FLAG, table2.FLAG

如果 table2.FLAG 有 3 个不同的值(活动、暂停、其他),那么我有 3 行,问题是如何将这三行合并为一个,如下所示: ID,FLAG,Active_Count,Suspend_Count,Other_Count.

好的,假设 ID 在 table 1 中是唯一的,您正在寻找这样的东西:

WITH test_data_1 (ID, FLAG) AS
(
  SELECT 123, 'Y' FROM DUAL UNION ALL
  SELECT 234, 'N' FROM DUAL
),
test_data_2 (ID, FLAG) AS
(
  SELECT 123, 'Active' FROM DUAL UNION ALL
  SELECT 123, 'Active' FROM DUAL UNION ALL
  SELECT 123, 'Suspend' FROM DUAL UNION ALL
  SELECT 123, 'Other' FROM DUAL UNION ALL
  SELECT 234, 'Active' FROM DUAL UNION ALL
  SELECT 234, 'Active' FROM DUAL UNION ALL
  SELECT 234, 'Other' FROM DUAL
)
SELECT *
FROM test_data_1 td1
INNER JOIN test_data_2 
  PIVOT (COUNT(*) AS COUNT FOR FLAG IN ('Active' AS ACTIVE, 'Suspend' AS SUSPEND, 'Other' AS OTHER)) td2 
  ON td1.id = td2.id;

注意在加入之前使用 PIVOT 格式化 Table 2。

只需使用内联的 CASE 语句来隔离每列中您想要的值,这是一种 PIVOT 或去规范化技术,没有开销设置 PIVOT 子句

SELECT table1.ID, table1.FLAG
 ,COUNT(CASE WHEN table2.FLAG = 'Active' THEN 1 END) as "Active"
 ,COUNT(CASE WHEN table2.FLAG = 'Suspended' THEN 1 END) as "Suspended"
 ,COUNT(CASE WHEN table2.FLAG = 'Other' THEN 1 END) as "Other"
FROM table1
INNER JOIN table2 ON table1.ID = table2.ID
WHERE table1.ID = 123
GROUP BY table1.ID, table1.FLAG

注意:SUM 可以用来代替此处的计数,计数有效是因为缺少的 ELSE 语句将解析为 null,而 Count不会计算空值。