サイトを検索したところ、同様の質問がいくつか見つかりましたが、この問題に具体的に対処するものはありません。そのため、答えはこの問題に完全には適合しません。12列のテーブルがあります。これらの 12 列のうちの 6 つ (1、2、3、4、5、6) には、1 から 100 までの数値で表される評価があります。 6 つの列。私がやりたいことは、6 つの列すべてを 1 つの合計として扱って、出現頻度ごとに数値をリストすることです。列 1 と列 4 の評価の頻度は気にしません。すべての列の頻度が必要です。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
して異なる列を連結する場合、各サブクエリはデータを介して個別のパスを使用します。この代替方法では、テーブルを数値テーブルに結合し、テーブルを 1 回だけ読み取ります。次に、case
ステートメントを使用して、数値に基づいて列を選択します。
最後のステップは、単純に集計を行ってカウントを取得することです。
于 2013-04-21T19:27:31.360 に答える