블로그를 이전 중이라 완료되기 전까지는 벨로그에 작성할 계획입니다.
이후 모든 글은 https://weekwith.me 에 작성 예정이니 다른 글이 궁금하시다면 해당 링크를 통해 방문해주세요.본 글은 [ LeetCode ] 2252. Dynamic Pivoting of a Table를 풀고 작성한 글입니다.
Table: Products
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| product_id | int |
| store | varchar |
| price | int |
+-------------+---------+
(product_id, store) is the primary key for this table.
Each row of this table indicates the price of product_id in store.
There will be at most 30 different stores in the table.
price is the price of the product at this store.
Implement the procedure PivotProducts
to reorganize the Products
table so that each row has the id of one product and its price in each store. The price should be null
if the product is not sold in a store. The columns of the table should contain each store and they should be sorted in lexicographical order.
The procedure should return the table after reorganizing it.
Return the result table in any order.
동적으로 피벗 테이블을 생성해야 하기 때문에 GROUP_CONCAT
함수를 사용해 동적으로 피벗 테이블을 만드는 구를 문자열로 만들고 이를 변수에 할당해서 PREPARE
구에서 사용하면 된다.
이때 한 가지 유의할 점은 GROUP_CONCAT
함수의 경우 기본적으로 1024 글자의 제한을 가지고 있기 때문에 SET SESSION
구를 활용해서 group_concat_max_len
변수의 값을 임의적으로 확장시켜야 한다는 것이다.
접근법을 토대로 문제를 해결하면 아래와 같다.
CREATE PROCEDURE PivotProducts()
BEGIN
SET SESSION group_concat_max_len = 1000000;
SET @store_stmt = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT('SUM(IF(store = "', store, '", price, NULL)) AS ', store)) INTO @store_stmt
FROM Products;
SET @prepared_stmt = CONCAT('SELECT product_id, ', @store_stmt, ' FROM Products GROUP BY product_id');
PREPARE stmt FROM @prepared_stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END