-
[SQL] FK를 이용하여 여러 Row data를 컬럼과 값으로 Group by 하려면.....공부/Database 2024. 2. 27. 00:05
제목처럼 GROUP BY를 할 수 있지만, 조건이 있습니다.
우선 테이블 명세부터 보고 설명을 하겠습니다.

Key-Value 형식처럼 사용하려고 설계하였습니다.
Key : infoType , Value: infoValue로 사용을 하고 있습니다.
동일한 UserId를 가진 상태로 InfoType과 InfoValue가 다르다면, 해당 조건에 충족합니다.
(즉, 하나의 UserId에 각각 다른 값들을 가진다는 조건입니다.)
순차적으로 설명을 하겠습니다.
1. CASE 문을 이용합니다.
SELECT id, infoType, infoValue, userId, surveyType, CASE WHEN infoType = '브랜드' THEN infoValue ELSE NULL END AS brand, CASE WHEN infoType = '종류' THEN infoValue ELSE NULL END AS category, CASE WHEN infoType = '가격' THEN infoValue ELSE NULL END AS price, CASE WHEN infoType = '옵션' THEN infoValue ELSE NULL END AS option FROM user_extra_info WHERE infoType IN ('브랜드', '종류', '가격', '옵션');* 유저가 선택한 브랜드, 종류, 가격, 옵션을 key-value 형식으로 저장하고 있는 구조라고 생각하면 편합니다.
* 한명의 유저는 브랜드, 종류, 가격, 옵션을 1개씩 가지고 있거나 없을 수도 있다는 가정입니다.
- 쿼리 결과 -

case 문으로 InfoType을 Colume으로 만들었습니다.
2. Gropu By와 MAX를 이용한다.
SELECT userId, MAX(CASE WHEN infoType = '브랜드' THEN infoValue ELSE NULL END) AS brand, MAX(CASE WHEN infoType = '종류' THEN infoValue ELSE NULL END) AS category, MAX(CASE WHEN infoType = '가격' THEN infoValue ELSE NULL END) AS price, MAX(CASE WHEN infoType = '옵션' THEN infoValue ELSE NULL END) AS option FROM user_extra_info WHERE infoType IN ('브랜드', '종류', '가격', '옵션') GROUP BY userId;* MAX가 집계함수로 사용할 수 있지만, 값이 1개인 경우 Value를 컬럼에서 확인할 수 있습니다.
* THEN 으로 Value를 전달하고, 없는 경우 NULL값을 전달하도록 하였습니다.
- 쿼리 결과 -

실제로, Type을 컬럼으로 지정하고, Value를 값으로 사용 후 유저 ID를 GROUP화 한 값을 확인할 수 있다.
물론, 좋은 방법은 아닐거라고 생각하지만, 관계형에서 key-value형식으로 구성하고 싶을 때와 group 화를 해야 한다면 해볼 수 있지만,
그런 설계는 좋지 않다고 판단한다.구조화된 테이블을 사용하지않고 변동성이 큰 테이블을 설계해야 된다면 고려해 볼 수 있지만, 다른 방법을 찾는 게 나을 거 같다.
Ref.
https://suy379.tistory.com/110
SQL CASE WHEN 구문 사용법 - 예제로 알아보기
오늘은 SQL에서 매우 자주 쓰이는 CASE WHEN 구문에 대해 포스팅합니다. CASE WHEN 구문은 SELECT절에 쓰이며, 대표적으로 2가지의 쓰임새가 있는데요! 1) 새로운 열을 생성하는 경우 SELECT CASE WHEN 기존 열
suy379.tistory.com
'공부 > Database' 카테고리의 다른 글
[PostgreSQL] PERCENTILE_CONT 함수를 이용한 중앙값 계산 (0) 2025.05.06 반복 일정 설계 (0) 2023.07.03 MongoDB - 배열 식별자를 통한 다중 update(feat.arrayFilters) (0) 2022.10.24 ORM(Object Relational Mapping) (0) 2021.12.24 MySQL 데이터 추가, 수정, 삭제 (0) 2021.09.01