2017-07-14 17 views
1

すべてが各列に1つの値で検出されますが、多値をサポートしていますか?私のクエリの1つの列の複数の値を持つピボットテーブル

例:

WITH 
INPUT_LIST AS 
(SELECT 1 PRODUCT_ID, 1 TYPE_ID, 1000 PRICE FROM DUAL 
UNION ALL 
SELECT 2 PRODUCT_ID, 1 TYPE_ID, 1500 PRICE FROM DUAL 
UNION ALL 
SELECT 3 PRODUCT_ID, 2 TYPE_ID, 500 PRICE FROM DUAL 
UNION ALL 
SELECT 4 PRODUCT_ID, 3 TYPE_ID, 2000 PRICE FROM DUAL 
UNION ALL 
SELECT 1 PRODUCT_ID, 4 TYPE_ID, 1000 PRICE FROM DUAL 
UNION ALL 
SELECT 2 PRODUCT_ID, 5 TYPE_ID, 1500 PRICE FROM DUAL 
UNION ALL 
SELECT 3 PRODUCT_ID, 2 TYPE_ID, 500 PRICE FROM DUAL 
UNION ALL 
SELECT 2 PRODUCT_ID, 3 TYPE_ID, 2000 PRICE FROM DUAL 
) 
SELECT * FROM 
(SELECT PRODUCT_ID, TYPE_ID, SUM(PRICE) TOTAL FROM INPUT_LIST GROUP BY PRODUCT_ID, TYPE_ID) 
PIVOT (SUM(TOTAL) FOR TYPE_ID IN (1 AS "FIRST_TYPE", 2 AS "SECOND_TYPE", 3 AS "THIRD_TYPE", 4 AS "FOURTH_TYPE", 5 AS "FIFTH")) 
ORDER BY PRODUCT_ID; 

マルチ値は、私はTYPE_ID in (3,4,5)に "OTHER_TYPE" をマークしたいわけ。次のようなものがあります:

PIVOT (SUM(TOTAL) FOR TYPE_ID IN (1 AS "FIRST_TYPE", 2 AS "SECOND_TYPE", (3,4,5) AS "OTHER_TYPE")) 

私は他の方法でクエリを使用できますが、私はそれをピボットできるのですか?

答えて

1

PIVOT句にはこのような機能はありません。
しかし、あなたはまだピボットに昔ながらの方法で行うことができます。

SELECT PRODUCT_ID, 
     sum(case when type_id = 1 then PRICE end) As FIRST_TYPE, 
     sum(case when type_id = 2 then PRICE end) As SEcOND_TYPE, 
     sum(case when type_id in (3,4,5) then PRICE end) ANOTHER_TYPE 
FROM INPUT_LIST 
GROUP BY PRODUCT_ID 
ORDER BY PRODUCT_ID; 
+0

や ''ではなく(1,2)ではありませんTYPE_ID (3,4,5)の 'type_idよりも。 – jeff6times7

+0

はい、これは私の仕事を他の方法でやりました。 – tungns304

1

だけのグループを第一のサブクエリ内の種類:

SELECT * 
FROM (
    SELECT PRODUCT_ID, 
     CASE 
      WHEN TYPE_ID IN (1,2) 
      THEN TYPE_ID 
      ELSE 3 
     END AS TYPE_ID, 
     PRICE 
    FROM INPUT_LIST 
) 
PIVOT (
    SUM(PRICE) FOR TYPE_ID IN (
    1 AS "FIRST_TYPE", 
    2 AS "SECOND_TYPE", 
    3 AS "OTHER_TYPE" 
) 
) 
ORDER BY PRODUCT_ID; 
+0

私は仕事を終わらせるためにこの方法を使用しています。しかしピボット部分を改善するものはありません。 – tungns304

関連する問題