ID | visit | vars_1 | vars_2 | vars_3 |
TEST_1 | D1 | 1 | 2 | 3 |
TEST_1 | D2 | 1 | 2 | 3 |
TEST_1 | D3 | 1 | 2 | 3 |
TEST_1 | D8 | 1 | 2 | 3 |
TEST_2 | D1 | 2 | 3 | 4 |
TEST_2 | D2 | 2 | 3 | 4 |
TEST_2 | D3 | 2 | 3 | 4 |
TEST_2 | D8 | 2 | 3 | 4 |
TEST_3 | D1 | 3 | 4 | 5 |
TEST_3 | D2 | 3 | 4 | 5 |
TEST_3 | D3 | 3 | 4 | 5 |
TEST_3 | D8 | 3 | 4 | 5 |
위 데이터를 조회하고자 합니다. 현재는 LEFT OUTER JOIN 으로 사용하고 있는데, 다른 방법은 없을까 해서 질문 올리게 되었습니다.
현재 조건은 아이디별로 한 행에 변수값의 D1, D2가 나오도록 하는 코드입니다.
환경은 MS-SQL 2014입니다.
WITH TEST_TBL(id, visit, vars_1, vars_2, vars_3) as ( SELECT 'TEST_1', 'D1', '1', '2', '3' Union ALL SELECT 'TEST_1', 'D2', '1', '2', '3' Union ALL SELECT 'TEST_1', 'D3', '1', '2', '3' Union ALL SELECT 'TEST_1', 'D8', '1', '2', '3' Union ALL SELECT 'TEST_2', 'D1', '2', '3', '4' Union ALL SELECT 'TEST_2', 'D2', '2', '3', '4' Union ALL SELECT 'TEST_2', 'D3', '2', '3', '4' Union ALL SELECT 'TEST_2', 'D8', '2', '3', '4' Union ALL SELECT 'TEST_3', 'D1', '3', '4', '5' Union ALL SELECT 'TEST_3', 'D2', '3', '4', '5' Union ALL SELECT 'TEST_3', 'D3', '3', '4', '5' Union ALL SELECT 'TEST_3', 'D8', '3', '4', '5' ) SELECT a.id as 'id_D1' , b.id as 'id_D2' , a.visit as 'visit_D1' , b.visit as 'visit_D2' , a.vars_1 as 'vars_1_D1' , b.vars_1 as 'vars_1_D2' , a.vars_2 as 'vars_2_D1' , b.vars_2 as 'vars_2_D2' FROM TEST_TBL as a LEFT OUTER JOIN TEST_TBL as b ON a.id = b.id and b.visit = 'D2' WHERE a.visit = 'D1'
위 코드 조회 결과는 다음과 같습니다.
id_D1 | id_D2 | visit_D1 | visit_D2 | vars_1_D1 | vars_1_D2 | vars_2_D1 | vars_2_D2 |
TEST_1 | TEST_1 | D1 | D2 | 1 | 1 | 2 | 2 |
TEST_2 | TEST_2 | D1 | D2 | 2 | 2 | 3 | 3 |
TEST_3 | TEST_3 | D1 | D2 | 3 | 3 | 4 | 4 |
SELECT id , MIN(CASE visit WHEN 'D1' THEN vars_1 END) vars_1_D1 , MIN(CASE visit WHEN 'D2' THEN vars_1 END) vars_1_D2 , MIN(CASE visit WHEN 'D1' THEN vars_2 END) vars_2_D1 , MIN(CASE visit WHEN 'D2' THEN vars_2 END) vars_2_D2 , MIN(CASE visit WHEN 'D1' THEN vars_3 END) vars_3_D1 , MIN(CASE visit WHEN 'D2' THEN vars_3 END) vars_3_D2 FROM test_tbl WHERE visit IN ('D1', 'D2') GROUP BY id ;