sql >> データベース >  >> RDS >> Oracle

Oracle11g のピボット テーブルで ROLLUP、RANK() を使用する方法

    あなたの範囲は、あなたが書いたクエリに対して完全に正しいとは思いませんが、「その間」が含まれているため、割り当ての文言はあいまいです-したがって、質問の文言として、正確に600のクレジットスコアが両方に表示されます「下位」および「平均」ブラケット。あなたのバージョンは 600 を「下」ブラケットに入れますが、どちらに入れるかは議論の余地があります。他の定義から「平均的」であるべきだと思いますが、不明です。質問には 500 未満のスコアの括弧はありませんが、スコアが 700 未満であるが 500 と 600 の間ではないため、それらのいずれかがある場合、現在のコードはそれらを「平均」括弧に含めます。

    だから私はそれを次のように解釈したでしょう:

    SELECT * FROM (
      SELECT case
               when CREDITSCORE >= 500 and CREDITSCORE < 600 then 'LOWER RANGE(500-600)'
               when CREDITSCORE >= 600 and CREDITSCORE < 700 then 'AVERAGE RANGE(600-700)'
               when CREDITSCORE >= 700 then 'PREMIUM RANGE(700+)'
        end as CREDITSCORE_RANGE,
        state
      FROM customer
    ) 
    PIVOT (
      count(state) FOR state IN ('PA' as pa, 'CA' as ca, 'NY' as ny, 'MD' as md)
    );
    

    質問のタイトルは ROLLUP を参照しており、合計行を取得するには、その関数を使用できます:

    SELECT creditscore_range, sum(pa) AS pa, sum(ca) AS ca, sum(ny) AS ny, sum(md) AS md
    FROM (
      SELECT * FROM (
        SELECT CASE
                 WHEN creditscore >= 500 AND creditscore < 600 THEN 'LOWER RANGE(500-600)'
                 WHEN creditscore >= 600 AND creditscore < 700 THEN 'AVERAGE RANGE(600-700)'
                 WHEN creditscore >= 700 THEN 'PREMIUM RANGE(700+)'
          END AS creditscore_range,
          state
        FROM customer
      ) 
      PIVOT (
        COUNT(state) FOR state IN ('PA' AS pa, 'CA' AS ca, 'NY' AS ny, 'MD' AS md)
      )
    )
    GROUP BY ROLLUP (creditscore_range);
    

    スコアが 500 未満の場合、Both には creditscore_range のスコアの行が含まれます。 nullとして; ROLLUP と紛らわしい バージョン。最も内側のクエリから 500 未満のスコアを除外することもできますが、それが必要か望ましいかは明確ではありません。

    ただし、ランキングについて話すときに割り当てが探しているかどうかはわかりません。これは、含まれる値に基づいて列の順序を変更することを意味します。州ごとのランキングは、データが別の方向にピボットされた場合に、より意味のあるものになります.




    1. SQLサーバーは、列名として部分文字列を使用して、別のテーブルに基づいてテーブルにデータを入力します

    2. mysqlの列データの並べ替え

    3. ホストWindowsからWSLmysqlに接続する方法

    4. MySQLの情報スキーマからインデックスの方向を取得する