跨多列计数值

时间:2019-01-04 17:43:12

标签: sql sql-server select count

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

可以按任何顺序添加值。我大约有一千个

Cpt1    Cpt2    Cpt3    Cpt4    Cpt5
63047   63048   63048   NULL    NULL

对于这一行,我希望以此作为结果

63047 1 
63048 2

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

尚不清楚您的表到底是什么样子,但我猜您正在寻找的是:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

许多数据库支持一种类型的横向联接。这些可以用来简化此操作。使用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;