Products 테이블의 각행을 (product_id, store, price) 구조로 재배열 할것
만일 store 값이 Null이라면, 해당 행을 추가하지 마라.
(select product_id, 'store1' as store, store1 as price from products
where store1 is not NULL)
union
(select product_id, 'store2' as store, store2 as price from products
where store2 is not NULL)
union
(select product_id, 'store3' as store, store3 as price from products
where store3 is not NULL)
'string' as columnName 하면 해당 열을 모두 같은 문자열 값으로 채울 수 있음.
근데 이것보다 pivot을 사용하면 훨씬 쿼리가 간단해지지 않을까?
그래서 찾아보니까 애초에 input 형태가 pivot 된거고 output 형태가 pivot 전인 테이블이다.
그래서 unpivot
을 하면된다.
Input:
Products table:
+------------+--------+--------+--------+
| product_id | store1 | store2 | store3 |
+------------+--------+--------+--------+
| 0 | 95 | 100 | 105 |
| 1 | 70 | null | 80 |
+------------+--------+--------+--------+
Output:
+------------+--------+-------+
| product_id | store | price |
+------------+--------+-------+
| 0 | store1 | 95 |
| 0 | store2 | 100 |
| 0 | store3 | 105 |
| 1 | store1 | 70 |
| 1 | store3 | 80 |
pivot
and unpivot
pivot : rows to columns 행을 열로
unpivot : columns to rows 열을 행으로
위의 output 행들을 store1, store2, store3 열로 바꾸는 것이다.
따라서 unpivot을 써보자.
pivot, unpivot 모두 group by 처럼 기준으로 할 열을 정하면 되는데 이 때는 store
행을 anchor행으로 선택하면 되겠다.
SELECT <Anchor column>,
[Pivoted Column 1] AS <Alias>,
[Pivoted column 2] AS <Alias>
...n
FROM
(<SELECT Statement of Set to be Pivoted>)
AS <Set Alias>
PIVOT
(
<Aggregate Function>(<Aggregated Column>)
FOR
[<Column With the Values for the Pivoted Columns Names>]
IN ( [Pivoted Column 1], [Pivoted column 2] ...)
) AS <Pivot Table Alias>;