📝 1795. Rearrange Products Table
🔹 제품 테이블 재배치
각 행에 (product_id, store, Price)가 포함되도록 Products 테이블을 재정렬하는 솔루션을 작성하세요. 매장에서 제품을 구입할 수 없는 경우 결과 테이블에 해당 product_id 및 매장 조합이 있는 행을 포함하지 마세요.
어떤 순서로든 결과 테이블을 반환합니다.
📝 문제 설명
Rearrange Products Table(1795번) 문제는 Products 테이블에서 데이터를 가로 형식에서 세로 형식으로 변환하는 문제입니다.
즉, store1, store2, store3처럼 개별 컬럼으로 존재하는 데이터를 (product_id, store, price) 형태의 행(Row) 단위로 변환해야 합니다.
또한, 가격 정보가 없는 경우(NULL)는 제외해야 합니다.
최종 결과는 어떤 순서로든 반환할 수 있습니다.
📊 테이블 구조
Products 테이블
Column Name | Type |
product_id | int |
store1 | int |
store2 | int |
store3 | int |
💡 SQL 문제 해결 방법
- 각 매장별로 product_id와 가격을 분리하여 가져오기
- UNION을 사용하여 매장별로 가격을 store와 price로 분리합니다.
- 각 매장에 대한 가격 정보를 하나의 테이블로 통합합니다.
- price가 NULL인 값은 제외
- WHERE price IS NOT NULL 조건을 사용하여 가격 정보가 없는 행을 제외합니다.
- 결과는 매장별로 구분되지 않으며 순서는 중요하지 않음
- 어떤 순서로든 반환할 수 있기 때문에 별도의 정렬 조건은 필요하지 않습니다.
반응형
🖥️ SQL 풀이
SELECT *
FROM (
SELECT product_id
, 'store1' AS store
, store1 AS price
FROM Products
UNION ALL
SELECT product_id
, 'store2' AS store
, store2 AS price
FROM Products
UNION ALL
SELECT product_id
, 'store3' AS store
, store3 AS price
FROM Products
) temp
WHERE price IS NOT NULL;
🔍 쿼리 분석
- UNION: 각 매장(store1, store2, store3)에 대해 동일한 형식 (product_id, store, price)로 값을 변환하여 반환합니다.
- 첫 번째 SELECT문은 store1의 가격 정보를 store와 price로 변환합니다.
- 두 번째 SELECT문은 store2의 가격 정보를 동일한 형식으로 변환합니다.
- 세 번째 SELECT문은 store3의 가격 정보를 변환합니다.
- WHERE price IS NOT NULL: 이 조건은 가격 정보가 없는 행을 제외합니다. store1, store2, store3 각각의 가격이 NULL일 경우 해당 행은 제외되므로, 실질적으로 가격 정보가 있는 행만 결과에 포함됩니다.
📌 실행 예제
📊 입력 데이터
Products 테이블
product_id | store1 | store2 | store3 |
0 | 95 | 100 | 105 |
1 | 70 | null | 80 |
쿼리 실행 결과
product_id | store | price |
0 | store1 | 95 |
0 | store2 | 100 |
0 | store3 | 105 |
1 | store1 | 70 |
1 | store3 | 80 |
- 제품 0은 세 매장 모두에서 각각 가격이 95, 100, 105로 판매됩니다.
- 제품 1은 매장 1에서 가격이 70, 매장 3에서 가격이 80으로 판매됩니다.
- 제품 1은 매장 2에서는 판매되지 않습니다.
🎯 결론
이 문제는 데이터를 가로에서 세로로 변환(PIVOT 해제)하는 방법을 연습할 수 있습니다.
특히, UNION ALL을 활용한 데이터 변환과 NULL 값 제거가 중요한 개념입니다.
더 많은 SQL 문제 풀이를 보고 싶다면 LeetCode SQL 문제 모음을 확인해 보세요! 🚀
728x90
반응형
'LeetCode' 카테고리의 다른 글
[LeetCode] 1890. The Latest Login in 2020 (2) | 2025.03.18 |
---|---|
[LeetCode] 1873. Calculate Special Bonus (0) | 2025.03.17 |
[LeetCode] 1741. Find Total Time Spent by Each Employee (0) | 2025.03.11 |
[LeetCode] 1693. Daily Leads and Partners (0) | 2025.03.10 |
[LeetCode] 1667. Fix Names in a Table (0) | 2025.03.10 |