오라클 행열 변환 0 7 889

by 구루구루구루 [Oracle 기초] [2020.06.25 16:52:14]


GUBUN | DIV | NUM | PRICE

--------------------------------

SNACK | 100 | 30 | 3000

SNACK | 400 | 24 | 9000

 

이렇게 되어있는 데이터를

 

GUBUN | DIV1 | DIV2

------------------------

SNACK | 100 | 400

SNACK | 3000 | 9000

 

이렇게 행열을 바꾸고 싶습니다.

PIVOT/UNPIVOT을 써보고있는데

WITH SELL_DATA AS
( SELECT 'SNACK' GUBUN, 100 DIV, 30 NUM, 3000 PRICE
  FROM DUAL
  UNION ALL
  SELECT 'SNACK' GUBUN, 400 DIV, 24 NUM, 9600 PRICE
  FROM DUAL )
SELECT *
FROM SELL_DATA
UNPIVOT ( PRICE FOR DIV2 IN ( DIV, PRICE ) )

이렇게 했더니

100

3000

400

9000

이렇게 값이 아래로만 내려가내요ㅠㅠ

 

행열 변환 방법 알려주세요ㅠㅠ

by 마농 [2020.06.25 17:04:36]
WITH sell_data AS
(
SELECT 'SNACK' gubun, 100 div, 30 num, 3000 price FROM dual
UNION ALL SELECT 'SNACK', 400, 24, 9000 FROM dual
)
SELECT *
  FROM sell_data
 UNPIVOT (v FOR gb IN (div, price))
 PIVOT(MIN(v) FOR num IN (30, 24))
;

 


by 구루구루구루 [2020.06.25 17:06:27]

만약 30, 24라는 값이 정해져있지 않고 유동적이라면 어떻게 해야하나요???


by 마농 [2020.06.25 17:08:47]

어떤 기준으로 2개 항목으로 구별되는지 명확한 설명이 필요합니다.


by 구루구루구루 [2020.06.25 17:14:26]

제가 예시로 적은 데이터는 

SNACK | 100 | 30 | 3000

SNACK | 400 | 24 | 9000

이렇게 였지만

실제로는 

SNACK | 100 | 30 | 3000

SNACK | 400 | 24 | 9000

SNACK | 100 | 50 | 3500

SNACK | 400 | 14 | 1000

이런식으로 많아질 수도 있고 값이 변경될수도 있어서 그때마다 정확하게 

PIVOT(MIN(v) FOR num IN (30, 24) 안에 컬럼 값을

30, 24, 50, 14 이렇게 적을수가 없을 경우에는 어떻게 해야하나해서요ㅠㅠ


by 구루구루구루 [2020.06.25 17:17:34]

IN절 안에 SELECT NUM FROM SELL_DATA 이렇게 했더니 MISSING EXPRESSION 오류가 뜨네요ㅠㅠ


by 마농 [2020.06.25 17:38:20]

어떻게 해야 할지 모르겠다고 하시면 안되구요.
어떻게 해야 할지를 정해 주셔야 합니다.
기준을 명확하게 정해 주셔야 합니다. 행렬 변환 기준
기준이 뭔지 잘 모르겠다면
CASE BY CASE 로 원본 대비 결과표를 보여주세요.


by 마농 [2020.06.25 17:42:06]
WITH sell_data AS
(
SELECT 'SNACK' gubun, 100 div, 30 num, 3000 price FROM dual
UNION ALL SELECT 'SNACK', 400, 24, 9000 FROM dual
)
SELECT *
  FROM (SELECT gubun, div, num, price
             , ROW_NUMBER() OVER(PARTITION BY gubun ORDER BY num) rn
          FROM sell_data
        )
 UNPIVOT (v FOR gb IN (div, num, price))
 PIVOT(MIN(v) FOR rn IN (1, 2, 3, 4, 5, 6))
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입