반응형
행을 열로 동적으로 변환하는 Mysql 쿼리
MySQL이 열을 행으로 변환하여 행에 필요한 만큼의 열을 동적으로 추가할 수 있습니다.제 질문이 피벗 테이블과 관련이 있을 수도 있다고 생각하지만 확신할 수 없으며 다음 예제를 제공하는 것 외에 이 질문을 어떻게 구성해야 할지 모르겠습니다.
두 개의 테이블 A와 B가 주어졌을 때, 그것은 다음과 같습니다.
표 A
+--+-----+----+
|id|order|data|
+--+-----+----+
|1 |1 |P |
+--+-----+----+
|2 |2 |Q |
+--+-----+----+
|2 |1 |R |
+--+-----+----+
|1 |2 |S |
+--+-----+----+
나는 다음과 같은 쿼리를 작성하는 것을 좋아합니다.
결과표
+--+-----+-----+
|id|data1|data2|
+--+-----+-----+
|1 |P |S |
+--+-----+-----+
|2 |R |Q |
+--+-----+-----+
기본적으로 저는 B표의 각 행을 결과표의 열로 바꾸고 싶습니다.id=1에 대한 테이블 B에 새로운 항목이 추가되었다면, 이 추가 데이터 포인트를 수용하기 위해 결과 테이블이 자동으로 열 하나씩 확장되기를 원합니다.
사용가능GROUP BY
그리고.MAX
피벗을 시뮬레이션합니다.MySQL도 지원합니다.IF
진술.
SELECT ID,
MAX(IF(`order` = 1, data, NULL)) data1,
MAX(IF(`order` = 2, data, NULL)) data2
FROM TableA
GROUP BY ID
다음 값이 여러 개인 경우order
, 쿼리를 수정할 필요가 없도록 동적 SQL이 더 적합할 수 있습니다.
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(`order` = ', `order`, ',data,NULL)) AS data', `order`)
) INTO @sql
FROM TableName;
SET @sql = CONCAT('SELECT ID, ', @sql, '
FROM TableName
GROUP BY ID');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
두 쿼리의 출력:
╔════╦═══════╦═══════╗
║ ID ║ DATA1 ║ DATA2 ║
╠════╬═══════╬═══════╣
║ 1 ║ P ║ S ║
║ 2 ║ R ║ Q ║
╚════╩═══════╩═══════╝
사용하셔야 합니다.MAX
그리고.GROUP BY
피벗 시뮬레이션:
SELECT Id,
MAX(CASE WHEN Order = 1 THEN data END) data1,
MAX(CASE WHEN Order = 2 THEN data END) data2
FROM TableA
GROUP BY Id
여기 SQL Fiddle이 있습니다.
언급URL : https://stackoverflow.com/questions/14834290/mysql-query-to-dynamically-convert-rows-to-columns
반응형
'sourcecode' 카테고리의 다른 글
도구: Android 매니페스트에서 교체하지 않음 (0) | 2023.10.06 |
---|---|
Larvel 마이그레이션을 통해 열의 기본값 변경 (0) | 2023.10.01 |
총알 포인트로 UI 레이블을 포맷하시겠습니까? (0) | 2023.10.01 |
C# WebBrowser 컨트롤 -- AJAX 이후에 문서 요소를 가져오시겠습니까? (0) | 2023.10.01 |
VS 2010에서 C# 앱의 릴리스 빌드를 "디버깅"할 수 있습니까? (0) | 2023.10.01 |