我想计算多列中的不同值并在单独的行中显示结果
I want to count distinct values in multiple column and show the results in separate rows
我是 SQL 的新手,正在处理一个数据集,我需要在每个列中计算 1,0 或 Y,N 标志并给出结果计数列。
举个例子,这是数据的样子:
Flag1
Flag2
Flag3
Flag4
N
Y
N
Y
Y
Y
Y
Y
N
N
N
N
Y
Y
N
N
这是我想要的:
Flag1
Flag2
Flag3
Flag4
COUNT
N
2
Y
2
N
1
Y
3
N
3
Y
1
N
2
Y
2
您只需要所有可能组合之间的并集:
select 'N' as Flag1, NULL as Flag2, NULL as Flag3, NULL as Flag4, (select count(*) from table_name where Flag1='N') as count
union all
select 'Y', NULL, NULL, NULL, (select count(*) from table_name where Flag1='Y') as count
union all
select NULL, 'N', NULL, NULL, (select count(*) from table_name where Flag2='N') as count
union all
select NULL, 'Y', NULL, NULL, (select count(*) from table_name where Flag2='Y') as count
union all
select NULL, NULL, 'N', NULL, (select count(*) from table_name where Flag3='N') as count
union all
select NULL, NULL, 'Y', NULL, (select count(*) from table_name where Flag3='Y') as count
union all
select NULL, NULL, NULL, 'N', (select count(*) from table_name where Flag4='N') as count
union all
select NULL, NULL, NULL, 'Y', (select count(*) from table_name where Flag4='Y') as count
使用 GROUP BY GROUPING SETS 函数有一种更简单的计算方法:
WITH sample_data AS (
SELECT *
FROM (VALUES
('N', 'Y', 'N', 'Y'),
('Y', 'Y', 'Y', 'Y'),
('N', 'N', 'N', 'N'),
('Y', 'Y', 'N', 'N')) T(Flag1, Flag2, Flag3, Flag4)
)
SELECT Flag1, Flag2, Flag3, Flag4, COUNT(*) AS COUNT
FROM sample_data
GROUP BY GROUPING SETS (Flag1, Flag2, Flag3, Flag4)
ORDER BY Flag1, Flag2, Flag3, Flag4;
结果:
FLAG1
FLAG2
FLAG3
FLAG4
COUNT
N
2
Y
2
N
1
Y
3
N
3
Y
1
N
2
Y
2
我是 SQL 的新手,正在处理一个数据集,我需要在每个列中计算 1,0 或 Y,N 标志并给出结果计数列。 举个例子,这是数据的样子:
Flag1 | Flag2 | Flag3 | Flag4 |
---|---|---|---|
N | Y | N | Y |
Y | Y | Y | Y |
N | N | N | N |
Y | Y | N | N |
这是我想要的:
Flag1 | Flag2 | Flag3 | Flag4 | COUNT |
---|---|---|---|---|
N | 2 | |||
Y | 2 | |||
N | 1 | |||
Y | 3 | |||
N | 3 | |||
Y | 1 | |||
N | 2 | |||
Y | 2 |
您只需要所有可能组合之间的并集:
select 'N' as Flag1, NULL as Flag2, NULL as Flag3, NULL as Flag4, (select count(*) from table_name where Flag1='N') as count
union all
select 'Y', NULL, NULL, NULL, (select count(*) from table_name where Flag1='Y') as count
union all
select NULL, 'N', NULL, NULL, (select count(*) from table_name where Flag2='N') as count
union all
select NULL, 'Y', NULL, NULL, (select count(*) from table_name where Flag2='Y') as count
union all
select NULL, NULL, 'N', NULL, (select count(*) from table_name where Flag3='N') as count
union all
select NULL, NULL, 'Y', NULL, (select count(*) from table_name where Flag3='Y') as count
union all
select NULL, NULL, NULL, 'N', (select count(*) from table_name where Flag4='N') as count
union all
select NULL, NULL, NULL, 'Y', (select count(*) from table_name where Flag4='Y') as count
使用 GROUP BY GROUPING SETS 函数有一种更简单的计算方法:
WITH sample_data AS (
SELECT *
FROM (VALUES
('N', 'Y', 'N', 'Y'),
('Y', 'Y', 'Y', 'Y'),
('N', 'N', 'N', 'N'),
('Y', 'Y', 'N', 'N')) T(Flag1, Flag2, Flag3, Flag4)
)
SELECT Flag1, Flag2, Flag3, Flag4, COUNT(*) AS COUNT
FROM sample_data
GROUP BY GROUPING SETS (Flag1, Flag2, Flag3, Flag4)
ORDER BY Flag1, Flag2, Flag3, Flag4;
结果:
FLAG1 | FLAG2 | FLAG3 | FLAG4 | COUNT |
---|---|---|---|---|
N | 2 | |||
Y | 2 | |||
N | 1 | |||
Y | 3 | |||
N | 3 | |||
Y | 1 | |||
N | 2 | |||
Y | 2 |