@nick rulez Принял ваш ответ и реализовал его, и он работает, я надеялся, что смогу сделать это с помощью простого запроса, а не процедуры, однако это определенно помогает. Спасибо за ваш прекрасный пример. Я должен буду прочитать документацию по некоторым частям, чтобы понять это, но в настоящее время он работает. Большое спасибо за ваш отличный ответ.
аюсь написать запрос для создания «таблицы» данных следующим образом:
SELECT cs.`category_id`, cs.`ProcessDate`, cs.`PercentChange`
FROM `Category_Statistics` cs
WHERE cs.`ProcessDate` >= '2011-05-10'
AND cs.`ProcessDate` <= '2011-05-14'
Что бы вернуть что-то вроде:
CategoryId | ProcessDate | PercentChange
-------------------------------------------
category_4 | 2011-05-10 | 10
category_4 | 2011-05-11 | 18
category_4 | 2011-05012 | 12
...
category_7 | 2011-05-10 | 21
category_7 | 2011-05-11 | 7
...
category_12 | 2011-05-10 | 7
category_12 | 2011-05-11 | 15
Теперь я хочу, чтобы результаты были примерно такими (из запроса MySQL, а не манипуляции приложением):
CategoryId | 2011-05-10 | 2011-05-11 | 2011-05-12 | 2011-05-13 | 2011-05-14 |
--------------------------------------------------------------------------------
category_4 | 10 | 18 | 12 | 9 | 14 |
category_7 | 21 | 7 | 16 | 14 | 13 |
categeory_12 | 7 | 15 | 11 | 19 | 8 |
--------------------------------------------------------------------------------
Есть две оговорки к этому:
Диапазон дат может увеличиваться или уменьшаться (в зависимости от запроса)
PercentChange может быть нулевым в некоторых случаях (допустим, для category_7 / 2011-05-12 может не быть задано значение)
Так что в конечном итоге я не совсем уверен, как построить выделенную часть запроса для отображения динамического числа столбцов (я знаю, что это как-то связано с CONCAT).
Редактировать -> Частичный рабочий код ->
SELECT `CategoryId`,
MAX(IF(c.`ProcessedOn` = '2011-04-20', c.`PercentChange`, NULL)) AS '2011-04-20',
MAX(IF(c.`ProcessedOn` = '2011-04-21', c.`PercentChange`, NULL)) AS '2011-04-21',
MAX(IF(c.`ProcessedOn` = '2011-04-22', c.`PercentChange`, NULL)) AS '2011-04-22',
MAX(IF(c.`ProcessedOn` = '2011-04-23', c.`PercentChange`, NULL)) AS '2011-04-23',
MAX(IF(c.`ProcessedOn` = '2011-04-24', c.`PercentChange`, NULL)) AS '2011-04-24'
FROM `Category_Gravity` c
WHERE c.`ProcessedOn` >= '2011-04-20'
AND c.`ProcessedOn` <= '2011-04-24'
GROUP BY `CategoryId`
Что мне нужно сделать сейчас, это повернуть
MAX(IF(c.`ProcessedOn` = '2011-04-20', c.`PercentChange`, NULL)) AS '2011-04-20',
в нечто более динамичное (как я изменю диапазоны дат)