0

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

最後のステップは、単純に集計を行ってカウントを取得することです。

于 2013-04-21T19:27:31.360 に答える