MySQL Pivot, JSON

2024. 11. 5. 10:14·MySQL
728x90

Pivot

피벗은 한 열에 포함된 여러 정보를 각각의 열 정보로 변환하는 것을 의미한다.

ex) 계절 컬럼 -> 봄, 여름, 가을, 겨울 컬럼으로 변환

집계함수 sum()과 if(조건, 참, 거짓)을 함께 사용하여 피벗을 구현

계절 이름으로 pivot을 구현하는 경우

-- season 컬럼의 계절 이름 정보를 각각의 column으로 분리

select uname, sum(if(season = '봄', amount, 0)) as '봄',
    sum(if(season = '여름', amount, 0)) as '여름',
    sum(if(season = '가을', amount, 0)) as '가을',
    sum(if(season = '겨울', amount, 0)) as '겨울',
    sum(amount) as '합계'
from pivottest
group by uname; -- 각각의 사용자 이름으로 집계
uname 봄 여름 가을 겨울 합계
박성화 0 10 0 0 10
김홍중 0 0 0 82 82
최산 66 26 0 0 92
송민기 0 0 35 0 35
정윤호 19 0 0 56 75
강여상 13 0 99 0 112
정우영 71 0 0 0 71
최종호 0 0 0 55 55

사용자 이름으로 pivot을 구현하는 경우

 -- uname 컬럼의 사용자 이름 정보를 각각의 column으로 분리

select season, sum(if(uname = '박성화', amount, 0)) as '박성화',
    sum(if(uname = '김홍중', amount, 0)) as '김홍중',
    sum(if(uname = '정윤호', amount, 0)) as '정윤호',
    sum(if(uname = '강여상', amount, 0)) as '강여상',
    sum(if(uname = '최산', amount, 0)) as '최산',
    sum(if(uname = '송민기', amount, 0)) as '송민기',
    sum(if(uname = '정우영', amount, 0)) as '정우영',
    sum(if(uname = '최종호', amount, 0)) as '최종호',
sum(amount) as '합계'
from pivottest
group by season order by season; -- 각각의 계절 이름으로 집계

|season |박성화|김홍중|정윤호|강여상|최산|송민기|정우영|최종호|합계|
|--|--|--|--|--|--|--|--|--|
|가을 |0| 0 |0 |99 |0| 35 |0| 0 |134|
|겨울 |0| 82 |56 |0 |0| 0 |0| 55| 193|
|봄 |0 |0 |19 |13 |66 |0 |71 |0| 169|
|여름| 10| 0 |0| 0 |26|0| 0| 0 |36|

JSON

JSON을 변수에 저장

-- 사용자 변수 @
SET @json = '{ "usertbl" : 
 [
     {"name":"최산", "height":177},
    {"name":"강여상", "height":175},
    {"name":"송민기", "height":184}
 ]
}'; 

변수에 할당하는 JSON 데이터는 ''로 감싸져 있어야 한다.

JSON_VALID(JSON변수)

SELECT JSON_VALID(@json);

파라미터로 들어간 JSON 변수가 올바른 JSON 형태인지 검사한다.
올바르다면 1, 아니라면 0을 반환

JSON_SEARCH(JSON변수, 갯수, 값)

SELECT JSON_SEARCH(@json, one, '최산'); -- "$.usertbl[0].name"

JSON변수에 저장된 JSON으로부터 특정한 값에 해당하는 데이터 선택자 반환.
만약 갯수가 one이라면 최초 1개를, all이라면 모든 데이터 선택자를 반환.
반환되는 값은 ""로 감싸져 있다.

JSON_EXTRACT(JSON변수, 선택자)

SELECT JSON_EXTRACT(@json, '$.usertbl[1].name'); -- "강여상"

JSON_SEARCH()와 반대로 동작
JSON변수에 저장된 JSON으로부터 특정한 선택자에 해당하는 값을 반환.
반환되는 값은 ""로 감싸져 있다.

JSON_INSERT(JSON변수, 선택자, 값)

SELECT JSON_INSERT(@json, '$.usertbl[0].mDate', '2024-07-10'); 
-- {"usertbl": [{"name": "최산", "mDate": "2024-07-10", "height": 177}, {"name": "강여상", "height": 175}, {"name": "송민기", "height": 184}]}

JSON변수와 선택자를 사용하여 해당 위치에 값을 삽입한 JSON을 반환.
SELECT와 함께 사용 시 JSON변수 내의 값이 바뀌는 것은 아님.

SET @json = JSON_INSERT(@json, '$.usertbl[0].mDate', '2024-07-10');

실제 변수값을 바꾸는 경우 위와 같이 할당

JSON_REPLACE(JSON변수, 선택자, 값)

SELECT JSON_REPLACE(@json, '$.usertbl[0].height', '180');
-- {"usertbl": [{"name": "최산", "height": "180"}, {"name": "강여상", "height": 175}, {"name": "송민기", "height": 184}]}

JSON변수와 선택자를 사용해 해당 위치에 존재하는 값을 대체한 JSON을 반환.
SELECT와 함께 사용 시 JSON변수 내의 값이 바뀌는 것은 아님.

SET @json = JSON_REPLACE(@json, '$.usertbl[0].height', '180');

실제 변수값을 바꾸는 경우 위와 같이 할당

JSON_REMOVE(JSON변수, 선택자)

SELECT JSON_REMOVE(@JSON, '$.usertbl[0]');
-- {"usertbl": [{"name": "강여상", "height": 175}, {"name": "송민기", "height": 184}]}

JSON변수와 선택자를 사용해 해당 위치에 존재하는 값 삭제
SELECT와 함께 사용 시 JSON변수 내의 값이 바뀌는 것은 아님.

SET @json = JSON_REMOVE(@json, '$.usertbl[0]');

실제 변수값을 바꾸는 경우 위와 같이 할당

728x90

'MySQL' 카테고리의 다른 글

MySQL 스토어드 프로그램 (1) 프로시저  (1) 2024.11.05
MySQL SQL 프로그래밍(스토어드 프로그램)  (0) 2024.11.05
MySQL 대용량 데이터 업로드 / 다운로드  (2) 2024.11.05
MySQL 명령어 정리 (5) - MySQL 내장함수  (0) 2024.11.05
INSERT 중복키 문제 처리  (0) 2024.11.05
'MySQL' 카테고리의 다른 글
  • MySQL 스토어드 프로그램 (1) 프로시저
  • MySQL SQL 프로그래밍(스토어드 프로그램)
  • MySQL 대용량 데이터 업로드 / 다운로드
  • MySQL 명령어 정리 (5) - MySQL 내장함수
suhsein
suhsein
티끌모아 태산
  • suhsein
    기억 못 할 거면 기록이라는 좋은 수단이 있다
    suhsein
  • 전체
    오늘
    어제
    • 분류 전체보기
      • ASAC
      • Next.js
      • Docker
      • MySQL
      • Java
      • Spring-Proxy, AOP
      • Spring Boot, JPA
      • Spring Security
      • DB
      • 알고리즘
      • PS
      • TOPCIT
      • AWS 자격증
      • 비공개
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 안녕하세요
  • 인기 글

  • 태그

    동적프로그래밍
    외판원순회
    티스토리챌린지
    포인터
    Alias
    해시
    DP
    tsp
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
suhsein
MySQL Pivot, JSON
상단으로

티스토리툴바