【问题标题】:Count value across multiple columns跨多列计算值
【发布时间】:2019-01-04 17:43:11
【问题描述】:

我希望计算一组值在表中出现的次数。这些值最多可以出现在 10 个不同的列中。无论它在哪一列,我都需要增加计数。我知道如果它们都在同一列但不跨越多个列,我该如何计算。

可以按任何顺序添加值。我有一千左右

Cpt1    Cpt2    Cpt3    Cpt4    Cpt5
63047   63048   63048   NULL    NULL

我希望这一行得到这样的结果

63047 1 
63048 2

【问题讨论】:

  • 请添加预期输出的数据示例
  • 很可能是一个糟糕的数据库设计。您确定您的数据已正确规范化吗?
  • 请包括样本数据以及所需的输出。猜测架构会使这个问题成为愚蠢的差事
  • 你的桌子有多大?
  • 我正在读取的表可能是 6k 行,大约有 1k 不同的代码可供查看

标签: sql sql-server select count


【解决方案1】:

您可以使用union all 调用将它们视为一列:

SELECT   col, COUNT(*)
FROM     (SELECT col1 FROM mytable
          UNION ALL
          SELECT col2 FROM mytable
          UNION ALL
          SELECT col3 FROM mytable
          -- etc...
         ) t
GROUP BY col

【讨论】:

    【解决方案2】:

    目前尚不完全清楚您的桌子到底长什么样,但我猜您正在寻找的是:

    SELECT row_count = COUNT(*),
           row_count_with_given_value = SUM ( CASE WHEN field1 = 'myValue' THEN 1 
                                                   WHEN field2 = 'myValue' THEN 1
                                                   WHEN field3 = 'myValue' THEN 1
                                                   WHEN field4 = 'myValue' THEN 1 ELSE 0 END)
      FROM myTable
    

    假设 fieldx 列不能为 NULL,你也可以这样写:

    SELECT row_count = COUNT(*),
           row_count_with_given_value = SUM ( CASE WHEN 'myValue' IN (field1, field2, field3, field4) THEN 1 ELSE 0 END)
      FROM myTable
    

    【讨论】:

      【解决方案3】:

      这样的事情可能会起作用(在适应您的值域和数据类型之后):

      create table t1 
      (i1 int,
       i2 int,
       i3 int);
      
       insert into t1 values (1,0,0);
       insert into t1 values (1,1,1);
       insert into t1 values (1,0,0);
      
       declare @i int = 0;
       select @i = @i + i1 + i2 + i3 from t1;
      
       print @i;
      
       drop table t1;
      

      输出为:5

      【讨论】:

      • 您假设 MySQL 或其他支持内联分配的 RDBMS。
      • @PM77-1 我不假设。该问题用 sql-server 标记。
      【解决方案4】:

      许多数据库都支持一种类型的横向连接。这些可用于简化此操作。使用 SQL Server/Oracle 12C 语法:

      select v.cpt, count(*)
      from t cross apply
           (values (cpt1), (cpt2), . . . 
           ) v(cpt)
      where cpt is not null
      group by v.cpt;
      

      【讨论】:

      • 有趣。会检查一下。这是在 sqlserver 16 中
      猜你喜欢
      • 2017-12-15
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 2022-11-07
      相关资源
      最近更新 更多