2013-09-27 10 views
1

У меня есть таблица с 3 колонками:Объединение нескольких строк в одной строке

COLUMN A: DATETIME 
COLUMN B: DOUBLE 
COLUMN C: INT 

Колонка A не является уникальным Есть много строк с одинаковым значением DATETIME, однако для каждого DATETIME КОЛОННЫ С является уникальным.

фон: Кто-то измеряется на 5 различных положениях температуры, и это хранится в базе данных:

COLUMN A | COLUMN B | COLUMN C 

12:00 | 23.4 | 4 

12:00 | 24.4 | 5 

12:00 | 25.4 | 6 

12:01 | 26.4 | 4 

12:01 | 27.4 | 5 

12:01 | 28.4 | 6 

Я хотел бы превратить это (в новой таблице или представлении) во что-то вроде:

COLUMN AA | COLUMNC_VALUE-4 | COLUMNC_VALUE-5 | COLUMNC_VALUE 6 

12:00  | 23.4   |  24.4  |  25.4 

12:01  | 26.4   |  27.4  |  28.4 

Значения в столбце C можно найти в другой таблице.

Возможно ли это в SQL или мне нужно написать код?

ответ

2

Вы хотите перенести данные, но так как MySQL не имеет встроенную PIVOT() функции, вы вручную можете сделать это с помощью MAX() и CASE.

SELECT ColA, 
     MAX(CASE WHEN ColC = 4 THEN ColB END) ColC_V4, 
     MAX(CASE WHEN ColC = 5 THEN ColB END) ColC_V5, 
     MAX(CASE WHEN ColC = 6 THEN ColB END) ColC_V6 
FROM TableName 
GROUP BY ColA 

Однако, если у вас есть неизвестное число значений в ColC, гораздо лучший способ это сделать в динамически,

SET @sql = NULL; 

SELECT GROUP_CONCAT(DISTINCT 
     CONCAT('MAX(CASE WHEN ColC = ''', 
       ColC, 
       ''' THEN ColB ELSE NULL END) AS ', 
       CONCAT('`ColC_V', ColC, '`') 
       )) INTO @sql 
FROM TableName; 

SET @sql = CONCAT('SELECT ColA, ', @sql, ' 
        FROM TableName 
        GROUP BY ColA'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
2

Это общая проблема с именем pivot table. И мое мнение - вы должны сделать это в приложении, а не в SQL, - это потому, что в СУБД это не так эффективно. Представьте, что у вас будет 100 различных значений для columnC - что тогда? Или разные значения columnC значений за один день.

Но если вы все еще хотите сделать это в MySQL, here является хорошим ответом на эту проблему.

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