2014-01-23 2 views
1

Я бы хотел перенести результаты запроса MySQL из строки row => value resultset в набор результатов, где ключ является заголовком столбца, а значение является строкой для этого колонка.Перенос результатов запроса 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

Ой, я только что видел, что здесь: http://stackoverflow.com/tags/pivot/info – Lmwangi

+0

Я не мог понять, почему этот ответ был выбран, поскольку он дает именно то, что @Lmwangi говорит, что это не решение. – j4x

0

Попробуйте это, почему вы хотите 1 для class2geography должно быть 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

> «Почему вы хотите, чтобы 1 для class2geography это было 2» :: Извините, это была опечатка. Исправлено: – Lmwangi

Смежные вопросы