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 SERVERORACLE,这里是 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”确实是一个视图或复杂查询,则尤其如此。