안녕하세요. 사수한테 요청을 받아서 쿼리를 짜고 있는데, 감이 도무지 잡히지 않아 질문드립니다 ㅠㅠ
사실 사수도 쿼리가 좀 어렵고 난해할 것 같아서 제가 못짜도 된다고 하셨는데, 그래도 해보고 싶어서 작성을 해보고 있거든요.
예를 들어서 TEMP라는 테이블에 아래와 같이 데이터가 있습니다.
| 파라미터 | 컬럼명 | 값 |
| A | C1 | 4 |
| A | C2 | 5 |
| A-01 | C3 | 6 |
| A-02 | C3 | 7 |
| A-03 | C3 | 8 |
위와 같이 A라는 데이터와 A에서 파생된 A-01, A-02, A-03 이라는 데이터가 있습니다.(이들의 파생관계는 다른 테이블을 통해서 알 수 있습니다.)
또, 컬럼명을 의미하는 컬럼과 값을 의미하는 컬럼이 있는데요.
제가 출력하고자 하는 형식은
| C1 | C2 | C3 | |
| A-01 | 4 | 5 | 6 |
| A-02 | 4 | 5 | 7 |
| A-03 | 4 | 5 | 8 |
이런 식으로 출력이 되어야 하는데, 가능한지가 궁금합니다..
C1과 C2는 A-01 ~ A-03의 상위인 A가 가지고 있는 데이터로, 같은 값을 가지게 되고 C3부터는 각 ROW별로 가지는 개별 데이터입니다.(A-01 ~ A-03은 무조건 같은 컬럼을 가지게 됩니다.)
C1, C2컬럼이 없을 때는 PIVOT을 사용해서 컬럼으로 출력을 했었는데요. 같은 값을 가지는 컬럼(C1, C2)이 들어와버리니 어떻게 해야하는지, 이게 가능한지 궁금합니다 ㅠ
관계가 정의되어 있는 테이블도 보여주세요.
케이스에 따라 결과가 달라질 수 있다면 다른 케이스 예제도 보여주세요.
조회 조건이 주어진다면? 해당 사항도 설명해 주세요.
답변 감사합니다!
관계 정의된 테이블은 rel이라는 테이블이라고 할 때
| PARAMETER | MAIN_PARAMETER |
| A | A |
| A-01 | A |
| A-02 | A |
| A-03 | A |
이런 식으로 상위에 있는 파라미터는 MAIN_PARAMETER와 PARAMETER가 동일하고, 하위인 파라미터는 상위 PARAMETER를 MAIN_PARAMETER로 가지게 됩니다.
조회 조건 같은 경우에는 상위 파라미터를 검색하든 하위 파라미터를 검색하든 본문의 예시와 같이 출력이 되는 것이 목표입니다.
만약 하위 파라미터가 한 개도 없는 C라는 파라미터를 검색하게 된다면 출력은 되지 않습니다.
파라미터와 코드의 값을 정확하게 알고 있다고 가정했을 때 다음과 같이 풀 수는 있습니다.
다만 가변적으로 변할 수 있는 값이라고 한다면? 쿼리 한방에는 안됩니다.
동적쿼리를 이용하셔야 합니다.
WITH t AS
(
SELECT 'A' p, 'C1' c, 4 v FROM dual
UNION ALL SELECT 'A' , 'C2', 5 FROM dual
UNION ALL SELECT 'A-01', 'C3', 6 FROM dual
UNION ALL SELECT 'A-02', 'C3', 7 FROM dual
UNION ALL SELECT 'A-03', 'C3', 8 FROM dual
)
SELECT b.p
, a.c1
, a.c2
, b.v c3
FROM (SELECT * FROM t WHERE p = 'A')
PIVOT (MIN(v) FOR c IN ('C1' c1, 'C2' c2)) a
, t b
WHERE b.p LIKE 'A-%'
;