SQL 查询:计算 table 中不同值的数量
SQL Query: Count the number of distinct values in a table
我正在尝试创建一个 SQL 查询来计算 SQL table 中不同值的数量。
我的 table 有 6 列:
n1 n2 n3 n4 n5 n6
______________________
3 5 7 9 11 20
3 7 11 15 17 20
3 15 26 28 30 40
15 26 30 40 55 56
3 4 5 9 15 17
17 20 26 28 30 40
这是我想要得到的结果:
value frequency
______________________
3 4
4 1
5 2
7 2
9 2
11 2
15 3
17 3
20 3
26 3
28 2
30 3
40 3
55 1
56 1
所以基本上,我需要查询查看整个 table,记下出现的每个值,并计算特定值出现的次数。
使用UNION ALL
获取1列中的所有nX
列值并聚合:
select value, count(*) as frequency
from (
select n1 as value from tablename union all
select n2 from tablename union all
select n3 from tablename union all
select n4 from tablename union all
select n5 from tablename union all
select n6 from tablename
) t
group by value
如果您使用 SQL SERVER
或 ORACLE
,这里是 UNPIVOT
的漂亮用例:
SELECT
[value]
, count(*) frequency
FROM
( select n1,n2,n3,n4,n5,n6 from tablename) p
UNPIVOT ([value] for nums in ( n1,n2,n3,n4,n5,n6 )) as unpvt
GROUP BY [value]
ORDER BY frequency DESC
如果性能很重要,这比 Union 更有效。
为此,我建议 cross apply
:
select v.n, count(*) as frequency
from t cross apply
(values (n1), (n2), (n3), (n4), (n5), (n6)) v(n)
group by v.n;
cross apply
,它实现了 横向连接 比 union all
对反透视数据更有效。如果您的“table”确实是一个视图或复杂查询,则尤其如此。
我正在尝试创建一个 SQL 查询来计算 SQL table 中不同值的数量。 我的 table 有 6 列:
n1 n2 n3 n4 n5 n6
______________________
3 5 7 9 11 20
3 7 11 15 17 20
3 15 26 28 30 40
15 26 30 40 55 56
3 4 5 9 15 17
17 20 26 28 30 40
这是我想要得到的结果:
value frequency
______________________
3 4
4 1
5 2
7 2
9 2
11 2
15 3
17 3
20 3
26 3
28 2
30 3
40 3
55 1
56 1
所以基本上,我需要查询查看整个 table,记下出现的每个值,并计算特定值出现的次数。
使用UNION ALL
获取1列中的所有nX
列值并聚合:
select value, count(*) as frequency
from (
select n1 as value from tablename union all
select n2 from tablename union all
select n3 from tablename union all
select n4 from tablename union all
select n5 from tablename union all
select n6 from tablename
) t
group by value
如果您使用 SQL SERVER
或 ORACLE
,这里是 UNPIVOT
的漂亮用例:
SELECT
[value]
, count(*) frequency
FROM
( select n1,n2,n3,n4,n5,n6 from tablename) p
UNPIVOT ([value] for nums in ( n1,n2,n3,n4,n5,n6 )) as unpvt
GROUP BY [value]
ORDER BY frequency DESC
如果性能很重要,这比 Union 更有效。
为此,我建议 cross apply
:
select v.n, count(*) as frequency
from t cross apply
(values (n1), (n2), (n3), (n4), (n5), (n6)) v(n)
group by v.n;
cross apply
,它实现了 横向连接 比 union all
对反透视数据更有效。如果您的“table”确实是一个视图或复杂查询,则尤其如此。