728x90
MySQL에서 간혹가다 세로(종)로 쌓여있는 데이터를 가로(횡)으로 전환하여 검색결과를 출력
1. 샘플 데이터 |
1
|
SELECT * FROM 동물_TABLE;
|
cs |
동물키 | 종류 | 이름 |
그룹1 | 곤충 | 메뚜기 |
그룹1 | 포유류 | 코끼리 |
그룹1 | 양서류 | 개구리 |
그룹2 | 곤충 | 사마귀 |
그룹2 | 포유류 | 기린 |
그룹2 | 양서류 | 도룡농 |
기본으로 그룹을 묶을수있는 키가 필요 합니다.
먼저 샘플데이터는, 같은 종류끼리 가로(횡)으로 정렬을 목적으로 하겠습니다.
2. 결과 : 가로횡 SELECT 쿼리 |
1
2
3
4
5
6
7
8
9
|
SELECT
동물키
, MAX(CASE WHEN 종류 = '곤충' THEN 이름 END) AS 곤충
, MAX(CASE WHEN 종류 = '포유류' THEN 이름 END) AS 포유류
, MAX(CASE WHEN 종류 = '양서류' THEN 이름 END) AS 양서류
FROM (
SELECT * FROM 동물_TABLE
) T
GROUP BY 동물키;
|
cs |
동물키 | 곤충 | 포유류 | 양서류 |
그룹1 | 메뚜기 | 코끼리 | 개구리 |
그룹2 | 사마귀 | 기린 | 도룡농 |
위와 같은 결과를 얻을수 있습니다.
CASE 문과 MAX값으로 각 그룹의 최대값을 가져와 보여주는 방식입니다.
이렇게 쉬운방식으로 세로(종) 데이터를 가로(횡) 으로 출력 할 수 있습니다.
어느날 아래와 같은 구조를 가진 테이블을
idx | area1 | area2 | area3 | area4 | area5 |
1 | 10 | 20 | 30 | 40 | 50 |
2 | 11 | 21 | 31 | 41 | 51 |
아래와 같이 변경 해야 하는 경우가 닥치고 말았다
no | position | value |
1 | area1 | 10 |
1 | area2 | 20 |
1 | area3 | 30 |
1 | area4 | 40 |
1 | area5 | 50 |
2 | area1 | 11 |
2 | area2 | 21 |
2 | area3 | 31 |
2 | area4 | 41 |
2 | area5 | 51 |
해결책 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
SELECT
`no`,
CASE
WHEN x=1 THEN 'area1'
WHEN x=2 THEN 'area2'
WHEN x=3 THEN 'area3'
WHEN x=4 THEN 'area4'
WHEN x=5 THEN 'area5'
END `position`,
CASE
WHEN x=1 THEN area1
WHEN x=2 THEN area2
WHEN x=3 THEN area3
WHEN x=4 THEN area4
WHEN x=5 THEN area5
END `value
FROM (
select * from default_data a,
(
select 1 AS x
union all select 2 AS x
union all select 3 AS x
union all select 4 AS x
union all select 5 AS x
) b
)
ORDER BY `NO`, `NUMBERS` ASC;
|
cs |
728x90