1

Oracle 10g のテーブルから作成したピボット テーブルを作成しようとしました。

テーブル構造は次のとおりです。

テーブルの作成 KOMUNIKA.STOCK_AREA
(
  PRODUCT_CODE VARCHAR2(20 バイト) NOT NULL,
  PRODUCT_NAME VARCHAR2(50 バイト)、
  AREA_CODE VARCHAR2(20バイト),
  AREA_NAME VARCHAR2(50バイト),
  数量番号(20,2)
)

そして、次のように表示されるデータが必要です:

名前 米国 ヨーロッパ アジア SthAm オーストラリア アフリカ その他の合計
C 2601 156 86 437 27 279 22 708 1,715
C 2605 926 704 7,508 1,947 982 782 1,704 14,553
合計 56,941 72,891 118,574 55,868 46,758 19,813 60,246 431,091

次に、iBatis フレームワークを使用して結果を取得し、それを ExtJs Grid に表示します。誰かが私と同じ問題を抱えていて、それを共有したい場合、それは私にとって本当に大きな恩恵です。

また、開始するリソースをすでに見つけています:

http://www.sqlsnippets.com/en/topic-12200.html

しかし、より簡単な解決策をすでに見つけている人がいる場合は、私の週末を節約できます:(、

皆さん、ありがとうございました

4

1 に答える 1

1

結果に必要な列数が固定されている限り、CASE式とGROUP BYを使用してSQL自体でピボットを実行できます(可変数の列を返すSQLを作成することはできません)。

お住まいの地域が次のようになっているとしましょう。

AREA_CODE AREA_NAME
--------- ---------
      101 US
      102 Europe
      103 Asia
      104 South America
      105 Australia
      106 Africa
      107 ...
      108 ...

上記の結果を返すクエリを次のように記述できます。

  SELECT PRODUCT_NAME
       , SUM(CASE WHEN AREA_CODE = 101
                  THEN QUANTITY ELSE 0 END) US
       , SUM(CASE WHEN AREA_CODE = 102
                  THEN QUANTITY ELSE 0 END) Europe
       , SUM(CASE WHEN AREA_CODE = 103
                  THEN QUANTITY ELSE 0 END) Asia
       , SUM(CASE WHEN AREA_CODE = 104
                  THEN QUANTITY ELSE 0 END) SthAm
       , SUM(CASE WHEN AREA_CODE = 105
                  THEN QUANTITY ELSE 0 END) Aust
       , SUM(CASE WHEN AREA_CODE = 106
                  THEN QUANTITY ELSE 0 END) Africa
       , SUM(CASE WHEN AREA_CODE NOT IN (101, 102, 103, 104, 105, 106)
                  THEN QUANTITY ELSE 0 END) Rest
       , SUM(QUANTITY) Total
    FROM KOMUNIKA.STOCK_AREA
GROUP BY PRODUCT_NAME;
于 2009-07-20T16:41:26.790 に答える