반응형
Pivot_table의 데이터에 대한 첫 번째 그림에서 볼 수 있듯이 Table1의 데이터를 변환하고 싶습니다. MySQL에서 가능합니까? 피벗 테이블 (A, B, C, D)의 값은 varchar 데이터 형식이므로 SUM 등 MySQL의 집계 함수를 사용할 수 없습니다.
Table1:
PK Name Subject Grade
-------------------------------------
1 Bob Math A
2 Bob History B
3 Bob Language C
4 Bob Biology D
5 Sue History C
6 Sue Math A
7 Sue Music A
8 Sue Geography C
Pivot_table:
Subject Bob Sue
-------------------------
Math A A
History B C
Language C
Biology D
Music A
Geography C
당신의 도움을 주셔서 감사합니다
해결 방법
정적 쿼리 (Bob 및 Sue에 관한 한)는 다음과 같을 수 있습니다.
SELECT subject,
MAX(CASE WHEN name = 'Bob' THEN grade END) `Bob`,
MAX(CASE WHEN name = 'Sue' THEN grade END) `Sue`
FROM table1
GROUP BY subject
이제 다른 이름을 설명 할 수 있도록 다음과 같은 동적 SQL을 사용합니다.
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('MAX(CASE WHEN name = ''', name,
''' THEN grade END) `', name, '`'))
INTO @sql
FROM table1;
SET @sql = CONCAT('SELECT subject, ', @sql, '
FROM table1
GROUP BY subject');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
산출:
호출 측에서 작업을 단순화하기 위해 저장 프로 시저로 래핑 할 수 있습니다.
DELIMITER $$
CREATE PROCEDURE sp_grade_report()
BEGIN
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT
CONCAT('MAX(CASE WHEN name = ''', name,
''' THEN grade END) `', name, '`'))
INTO @sql
FROM table1;
SET @sql = CONCAT('SELECT subject, ', @sql, '
FROM table1
GROUP BY subject');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
샘플 사용법 :
CALL sp_grade_report();
참조 페이지 https://stackoverflow.com/questions/18629155
반응형
'MySql' 카테고리의 다른 글
MySQLi_connect를 사용하여 MySQL에 연결할 수 없습니다. (0) | 2020.12.23 |
---|---|
MySQL Ignited-Datatables로 검색하는 동안 'like'작업에 대한 데이터 정렬 조합이 잘못되었습니다. (0) | 2020.12.23 |
MySQL mysql 셸 내에서 테이블 라인없이 쿼리 결과 표시 (비표 형식 출력) (0) | 2020.12.23 |
MySQL 최대 값을 기준으로 테이블 결합 (0) | 2020.12.23 |
MySQL 업데이트가 있으면 삽입하십시오-중복 키 혼동시 (0) | 2020.12.23 |
댓글