2013-03-06 2 views
1

У меня есть таблица, как показано нижеMySQL, как сделать сумму от продукта и месяц

Date  | Product  | Qty 
-------------|---------------|------ 
12-Dec-12 | reference1 | 1 
14-Dec-12 | reference2 | 2 
14-Dec-12 | reference1 | 3 
1-Jan-13  | reference2 | 4 
3-Jan-13  | reference2 | 5 
3-Jan-13  | reference3 | 6 

, и я хотел бы получить его, как показано ниже с помощью запроса

Product | Dec 2012 | Jan 2013 
===========|============|========== 
reference1 | 4  | 0 
reference2 | 2  | 9 
reference3 | 0  | 6 

Я знаю, как чтобы сгруппировать уже, моя проблема заключается в том, как иметь динамический столбец (я хотел был бы иметь возможность выбрать последний 6 months, 12 months или 24 months).

ответ

2

Вы пытаетесь сделать 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 | 
+0

waouh, 4 минуты, чтобы отредактировать мое сообщение и дать мне ответ, это настоящая работа. спасибо, ты узнал мою проблему, я не знал, где искать. Думаю, с вашим ответом я могу справиться. –

+0

@ VincentAndre Я отредактировал свой ответ, чтобы включить динамическую версию. – Taryn

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