我正在计算表中一组值出现的次数。这些值最多可以出现在10个不同的列中。无论它在哪一列中,我都需要增加计数。我知道如何将它们全部放在同一列中但不跨越多个列。
可以按任何顺序添加值。我大约有一千个
Cpt1 Cpt2 Cpt3 Cpt4 Cpt5
63047 63048 63048 NULL NULL
对于这一行,我希望以此作为结果
63047 1
63048 2
答案 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;