(我的)SQL - 从不同列的表中计算值

时间:2014-05-12 18:54:49

标签: mysql sql

我需要获取表中每个值的计数。问题是我需要从一个表中的3列中获取它。

(简化)数据库表看起来像这样:

+---------+------+--------+------+
|   Id    | Col1 | Col2   | Col3 | 
+---------+------+--------+------+
|    1    |  a   |  a     |      |
|    2    |  b   | null   |  a   |
|    3    |  b   |  b     |  c   |
|    4    |  d   |  a     |  null|
|    5    |  a   |  c     |  c   |
+---------+------+--------+------+

这就是我需要的结果:

+-------+-------+
|  Col  | Count |
+-------+-------+
|   a   |   5   |
|   b   |   3   |
|   c   |   3   |
|   d   |   1   |
+-------+-------+

有什么建议吗?

编辑:我也希望获得具有最高计数的x行数量的顶部,即使在计数或者col上按asc / desc进行排序时,必须显示10 HIGHEST。我发现当我通过Count desc订购时,一个简单的限制10将不起作用。然后我会得到10个最低值而不是最高值。

2 个答案:

答案 0 :(得分:0)

您的原始问题可以使用union all然后使用sum case来解决:

select 'a', sum(
  (case when col1 = 'a' then 1 else 0 end)+
  (case when col2 = 'a' then 1 else 0 end)+
  (case when col3 = 'a' then 1 else 0 end))
from yourtable
union all
select 'b', sum(
  (case when col1 = 'b' then 1 else 0 end)+
  (case when col2 = 'b' then 1 else 0 end)+
  (case when col3 = 'b' then 1 else 0 end))
from yourtable
...

答案 1 :(得分:0)

最简单的可能是UNION ALL GROUP BY;

SELECT col, COUNT(*) count
FROM (
  SELECT col1 col FROM mytable UNION ALL 
  SELECT col2 col FROM mytable UNION ALL 
  SELECT col3 col FROM mytable
)z
GROUP BY col
HAVING col IS NOT NULL
ORDER BY count DESC
LIMIT 10

An SQLfiddle to test with

如果您希望将其限制在前10名,但订购了另一个方向,you can just wrap it in a subquery and order the outer one