본문 바로가기

DATABASE

mysql 세로데이터를 가로 데이터 , 가로데이터를 세로데이터로

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