Вы пытаетесь сделать pivot данные из строк в столбцы. MySQL не имеет функцию поворота, но вы можете использовать агрегатную функцию с CASE
, чтобы получить результат:
select product,
sum(case when month(date) = 12 and year(date) = 2012
then qty else 0 end) Dec2012,
sum(case when month(date) = 1 and year(date) = 2013
then qty else 0 end) Jan2013
from yourtable
group by product
См SQL Fiddle with Demo.
Это также можно записать с помощью подзапроса, чтобы получить дату в формате месяц-год:
select product,
sum(case when MonthYear = 'Dec_2012' then qty else 0 end) Dec2012,
sum(case when MonthYear = 'Jan_2013' then qty else 0 end) Jan2013
from
(
select product,
date_format(date, '%b_%Y') MonthYear,
qty
from yourtable
) src
group by product;
См SQL Fiddle with Demo.
Затем, если вы хотите, чтобы сформировать список дат динамически или будете иметь неизвестное количество дат, которые вы хотите, чтобы вернуться, вы можете использовать подготовленное заявление для создания динамического SQL:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when MonthYear = ''',
MonthYear,
''' then qty else 0 end) AS ',
MonthYear
)
) INTO @sql
FROM
(
select product,
date_format(date, '%b_%Y') MonthYear,
qty
from yourtable
) src;
SET @sql = CONCAT('SELECT product, ', @sql, '
from
(
select product,
date_format(date, ''%b_%Y'') MonthYear,
qty
from yourtable
) src
GROUP BY product');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
См SQL Fiddle with Demo. Все три дадут вам результат:
| PRODUCT | DEC_2012 | JAN_2013 |
------------------------------------
| reference1 | 4 | 0 |
| reference2 | 2 | 9 |
| reference3 | 0 | 6 |
waouh, 4 минуты, чтобы отредактировать мое сообщение и дать мне ответ, это настоящая работа. спасибо, ты узнал мою проблему, я не знал, где искать. Думаю, с вашим ответом я могу справиться. –
@ VincentAndre Я отредактировал свой ответ, чтобы включить динамическую версию. – Taryn