0

我搜索了该站点并发现了一些类似的问题,但没有具体解决此问题。因此,答案不太适合这个问题。我有一个有 12 列的表。这十二列中的六列(一、二、三、四、五、六)的等级表示为从 1 到 100 的数值。所以我可能有一行( rowId=7 )在每一列中都有一个唯一的数值六列。我想要做的是按它们出现的频率列出数值,将所有六列视为一个总数。我不在乎第一列和第四列中评分的频率。我只需要所有列的频率。似乎 UNION 是要走的路,但 UNION 不能使用 ORDER BY 进行排序。我对几种不同的情况感到困惑,以及最终不成功的查询变体。我不会在这里逐条列出这些失败,而是询问是否有人知道这样做的方法。

4

2 回答 2

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 小提琴]

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

于 2013-04-21T19:38:17.453 回答
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语句根据数字选择哪一列。

最后一步是简单地进行聚合以获取计数。

于 2013-04-21T19:27:31.360 回答