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