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
不会计算空值。
我有两个表,每个表都有一个列 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
不会计算空值。