我很难编写查询,计算多列中特定值的出现次数。我无法改变db的结构。我知道我可以在最后使用多个查询和联合来做到这一点,但我想知道是否有更聪明的解决方案。
这是一个例子。
+ ----------- ------------ + ------------ + ------- + ------ +
| A | C |
ç|
d |
+ ----------- ------------ + ------------ + ------- + ----- +
| VALUE1 | value2 | value1 | value3 |
|值2 | value3 | value1 | value4 |
| VALUE1 | value3 | value2 | value1 |
|值3 | value1 | value1 | value1 |
| VALUE1 | value1 | value1 | value1 |
+ ----------- ------------ + ------------ + ------- + ----- +
我想计算每列的值= value1的字段数。结果集应如下所示:
+ ----------- ------------ + +
|专栏|统计|
+ ----------- ------------ + +
| A | 3 |
| C | 2 |
| ç| 4 |
| d | 3 |
+ ----------- + ------------ +
由于
答案 0 :(得分:2)
如果您希望将它放在与Anirudh的响应类似的单行上,请尝试以下操作:
SELECT SUM(A='Value1'),
SUM(B='Value1'),
SUM(C='Value1'),
SUM(D='Value1')
FROM TableName
或者按照您指定的方式使用它:
SELECT 'A', SUM(A='Value1')
FROM TableName
UNION
SELECT 'B', SUM(B='Value1')
FROM TableName
UNION
SELECT 'C', SUM(C='Value1')
FROM TableName
UNION
SELECT 'D', SUM(D='Value1')
FROM TableName
编辑:SQL小提琴http://sqlfiddle.com/#!9/5a99a/6
答案 1 :(得分:0)
你可以使用水平聚合
来做到这一点的
的`SELECT sum(case when A=value1 then 1 else 0 END) as CountValue1,sum(case when A=value2 then 1 else 0 END) as CountValue2,sum(case when A=value3 then 1 else 0 END) as CountValue3 FROM tableName;`
的
通过这种方式,您可以将行转换为列而不是将行转换为行