【问题标题】:SQL Query: Count the number of distinct values in a tableSQL 查询:计算表中不同值的数量
【发布时间】:2021-02-26 11:20:58
【问题描述】:

我正在尝试创建一个 SQL 查询来计算 SQL 表中不同值的数量。 我的表有 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

所以基本上,我需要查询来查看整个表,记下出现的每个值,并计算特定值出现的次数。

【问题讨论】:

  • UNION ALL 5 次,GROUP BY 结果。

标签: sql sql-server count distinct frequency


【解决方案1】:

为此我会推荐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 更有效地处理数据。如果您的“表”确实是一个视图或复杂查询,则尤其如此。

【讨论】:

    【解决方案2】:

    如果您使用的是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 更有效。

    【讨论】:

    • 对未指定 dbms 的问题的产品特定答案。至少告诉我们这是用于哪个 dbms。
    • 我正在使用 Microsoft SQL Server。两种解决方案都非常出色。谢谢@Forpas 和 Eshirvana(以及 Jarlh 的前进方向)
    【解决方案3】:

    使用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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多