Forum Stats

  • 3,852,479 Users
  • 2,264,108 Discussions
  • 7,905,079 Comments

Discussions

PIVOT演算子を使用して、複数の集計項目をそれぞれ別の列で表示させるには?

user9245968
user9245968 Member Posts: 6
edited Jun 20, 2011 10:16PM in SQLとPL/SQL
DB:Oracle11g

①の表をPivot関係演算子を使用して、②のように出力する方法は
ないでしょうか?
(二つ以上の集計項目で、PIVOTを作ることは出来ないでしょうか?)

③のようにpivot関係演算子を使用したサブクエリを二つ作り、
結合すれば出来ますが、出来れば④のようなイメージでサブクエリを
使用しないでもPIVOTが作成できないかと思い、質問させていただき
ました。(実際には④のSQLは流すと実行エラーになります。)
いろいろ調べてもみつけられなかったので、もしご存知の方がいら
っしゃいましたら、ご教授いただけないでしょうか。

①wk_pivot_test表

COD COD   VALUE1   VALUE2
--- --- ---------- ----------
C01 S01     1     11
C01 S02     2     12
C02 S01     3     13
C02 S02     4     14

↓↓↓

②期待結果

COD S01_VALUE1 S01_VALUE2 S02_VALUE1 S02_VALUE2
--- ---------- ---------- ---------- ----------
C01     1     11     2     12
C02     3     13     4     14


SELECT
  A.code1,
  A.S01 s01_value1,
  B.S01 s01_value2,
  A.S02 s02_value1,
  B.S02 s02_value2
FROM
(
  SELECT
    *
  FROM
  (
    SELECT
      code1,
      code2,
      value1
    FROM
      wk_pivot_test
  )
  PIVOT
  (
    SUM(value1) FOR code2 IN ('S01' AS "S01", 'S02' AS "S02")
  )
)  A,
(
  SELECT
    *
  FROM
  (
    SELECT
      code1,
      code2,
      value2
    FROM
      wk_pivot_test
  )
  PIVOT
  (
    SUM(value2) FOR code2 IN ('S01' AS "S01", 'S02' AS "S02")
  )
)  B
WHERE
  A.code1 = B.code1
ORDER BY
  A.code1
;


  SELECT
    *
  FROM
  (
    SELECT
      code1,
      code2,
      value1,
      value2
    FROM
      wk_pivot_test
  )
  PIVOT
  (
    SUM(value1), SUM(value2) FOR code2 IN ('S01' AS "S01", 'S02' AS "S02")
  );

Edited by: user9245968 on 2011/06/20 2:02

Answers

  • Aketi Jyuuzou
    Aketi Jyuuzou Member Posts: 1,072 Bronze Badge
    as指定を使ってみました。
    with wk_pivot_test(code1,code2,value1,value2) as(
    select 'C01','S01',1,11 from dual union all
    select 'C01','S02',2,12 from dual union all
    select 'C02','S01',3,13 from dual union all
    select 'C02','S02',4,14 from dual)
    select *
      from wk_pivot_test
    pivot(sum(value1) as value1,sum(value2) as value2
          for (code2) in('S01' as S01,'S02' as S02))
    order by code1;
    
    COD  S01_VALUE1  S01_VALUE2  S02_VALUE1  S02_VALUE2
    ---  ----------  ----------  ----------  ----------
    C01           1          11           2          12
    C02           3          13           4          14
  • user9245968様

    ご教授いただきまして、ありがとうございます。
    ASの使用で求めていた形が実現できるとは。
    私が例として記載したものよりも実行計画もシンプルですし。

    勉強になりました。
    ありがとうございました。
This discussion has been closed.