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