多列COUNT

时间:2013-04-21 19:22:07

标签: mysql sql

我搜索了网站,发现了一些类似的问题,但没有具体解决这个问题。因此,答案不太适合这个问题。我有一个12列的表。这十二列中的六列(一,二,三,四,五,六)的等级表示为数值1到100.所以我可能有一行(rowId = 7),每行中都有一个唯一的数值六列。我想要做的是按照它们出现的频率列出数值,将所有六列视为一个总数。我不关心第一列和第四列的评级频率。我只需要所有列的频率。看起来好像是UNION,但是UNION不能使用ORDER BY进行排序。我已经对几个不同的,最终不成功的查询变化感到困惑。而不是在这里逐项列出这些失败,我只会问是否有人知道如何做到这一点。

2 个答案:

答案 0 :(得分:2)

你的意思是这样吗?

SELECT V, COUNT(*) C
FROM (
    SELECT one V FROM your_table
    UNION ALL
    SELECT two FROM your_table
    UNION ALL
    SELECT three FROM your_table
    UNION ALL
    SELECT four FROM your_table
    UNION ALL
    SELECT five FROM your_table
    UNION ALL
    SELECT six FROM your_table
) Q
GROUP BY V
ORDER BY C DESC;

[SQL Fiddle]

这将为您提供每个不同的值,以及它出现的次数(无论列如何)。

答案 1 :(得分:1)

这是一种非常有效的方法:

select (case when n.n = 1 then t.one
             when n.n = 2 then t.two
             when n.n = 3 then t.three
             when n.n = 4 then t.four
             when n.n = 5 then t.five
             when n.n = 6 then t.six
        end) as col, count(*) as cnt
from t cross join
     (select 1 as n union all select 2 union all select 3 union all
      select 4 union all select 5 union all select 6
     ) n
group by (case when n.n = 1 then t.one
               when n.n = 2 then t.two
               when n.n = 3 then t.three
               when n.n = 4 then t.four
               when n.n = 5 then t.five
               when n.n = 6 then t.six
          end)

使用union(或union all)连接不同的列时,每个子查询都使用单独的数据传递。此替代方法将表连接到数字表,仅读取表一次。然后,它使用case语句根据数字选择哪一列。

最后一步只是进行聚合以获得计数。