2014-01-23 3 views
1

MySQL 쿼리의 결과를 행당 키 => 값 결과 집합에서 키가 열 머리글이고 값이 해당 행 항목 인 결과 집합으로 바꿔야합니다. 기둥. 다음 데이터MySQL 쿼리 결과 바꾸기

주어

|------------------+-------------| 
| CLASS_LESSON | ATTENDANTS | 
|------------------+-------------| 
| class1art  | 1   | 
| class1history | 1   | 
| class2geography | 2   | 
|------------------+-------------| 
제가

|------------+---------------+------------------| 
| class1art | class1history | class2geography | 
|------------+---------------+------------------| 
| 1   | 1    | 2    | 
|------------+---------------+------------------| 

로 변환하려는

클래스/공과 쌍 동적 있다고 가정한다; 언제든지 추가하거나 제거 할 수 있습니다. typical 'pivot table' sql 솔루션에서 제안 된대로 명시 적으로 호출하고 싶지 않습니다.

select 
    MAX(CASE WHEN class_lesson = 'class1art' THEN attendants ELSE 0 END) AS class1art, 
    MAX(CASE WHEN class_lesson = 'class1history' THEN attendants ELSE 0 END) AS class1history, 
    MAX(CASE WHEN class_lesson = 'class2geography' THEN attendants ELSE 0 END) AS class2geography, 
    MAX(CASE WHEN class_lesson = 'class7art' THEN attendants ELSE 0 END) AS class7art, 
    MAX(CASE WHEN class_lesson = 'class7history' THEN attendants ELSE 0 END) AS class7history 

from 
    (select 
     group_concat(distinct class, lesson) as class_lesson, 
      count(*) as attendants 
    from 
     TableName 
    group by class , lesson 
    ) a 

여기에 샘플 데이터로 SQLFiddle 환경입니다. 저장 프로 시저를 사용하지 않고 이것이 가능합니까?

답변

0

SELECT 
MAX(CASE WHEN t.CLASS_LESSON = 'class1art' THEN t.ATTENDANTS ELSE NULL END) AS class1art, 
MAX(CASE WHEN t.CLASS_LESSON = 'class1history' THEN t.ATTENDANTS ELSE NULL END) AS class1history, 
MAX(CASE WHEN t.CLASS_LESSON = 'class2geography' THEN t.ATTENDANTS ELSE NULL END) AS class2geography 
FROM 
(
select 
group_concat(distinct class, lesson) as class_lesson, count(*) as attendants 

from 
TableName 

group by 
class, lesson 
) as t 

FIDDLE DEMO

+0

오, 내가 여기 있음을 본 적이해야 class2geography 당신이 1 원하는 왜 하나를 시도하십시오 : – Lmwangi

+0

@Lmwangi가 원하는 해결책이 아니라고 정확히 설명했기 때문에이 답변을 선택한 이유를 이해할 수 없었습니다. – j4x

0

그것이 2

SELECT 
MAX(CASE WHEN t.clsubject = 'class1art' THEN t.attndee ELSE NULL END) AS class1art, 
MAX(CASE WHEN t.clsubject = 'class1history' THEN t.attndee ELSE NULL END) AS class1history, 
MAX(CASE WHEN t.clsubject = 'class2geography' THEN t.attndee ELSE NULL END) AS class2geography 
FROM 
(
SELECT CONCAT(class,lesson) AS clsubject, COUNT(*) AS attndee FROM TableName GROUP BY clsubject 
) t 
+0

> '왜 2 학급을 원하면 2 대야': : 미안 해요, 오타였습니다. 수정 됨 – Lmwangi