2014-10-08 3 views
0

Я использую MySql 5.5.38 и получил следующую таблицу (это только фрагмент, реальный содержит ~ 500 позиций):SQL цикла с агрегацией данных

+------+-------+----------+-------+--------+ 
| id | date | product | type | sales | 
+------+-------+----------+-------+--------+ 
| 4513 | 14958 | XXXXXXX |  1 |  3 | 
| 4514 | 14958 | XXXXXXX |  2 |  5 | 
| 4519 | 14958 | YYYYYYY |  1 |  10 | 
| 4531 | 14958 | YYYYYYY |  3 | 150 | 
| 4534 | 14959 | ZZZZZZZ |  1 |  5 | 
| 4536 | 14959 | ZZZZZZZ |  2 |  5 | 
|+------+-------+----------+-------+--------+ 

, из которого мне нужно генерировать ежедневно объем продаж по видам продукции:

+-------+----------+----------+----------+ 
| date | XXXXXXX | YYYYYYY | ZZZZZZZ | 
+-------+----------+----------+----------+ 
| 14958 |  8 |  110 |  0 | 
+-------+----------+----------+----------+ 
| 14959 |  0 |  0 |  10 | 
|+------+----------+----------+----------+ 

в результате таблица должна выглядеть точно так, как и выше - с продуктами в колоннах и дней подряд.

Просто найдите некоторые указатели, а не рабочее решение. Спасибо, Павель.

+3

http://stackoverflow.com/q/7674786/1169798 – Sirko

+0

вы можете делайте это в одном запросе, используйте случаи для своих xxxx, yyyy, xxx и просто суммируйте и группируйте их. – boomoto

+0

Вы хотите сделать сумму (продажи) и группу по продукту и заказу на дату –

ответ

1

Для динамической агрегации используйте GROUP_CONCAT с CONCAT

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT  
    CONCAT('SUM(CASE WHEN product= "',  
    product, '" THEN sales ELSE 0 END) AS ' 
    , product)) 
INTO @sql 
FROM 
    my_table; 

SET @sql = CONCAT('SELECT date, ', @sql, ' 
        FROM my_table 
        GROUP BY date'); 

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

Использование условного case с group by (для статического)

SELECT s.date, 

SUM(
CASE 
WHEN s.product='XXXXXXX' 
THEN s.sales 
ELSE 0 
END 
) AS 'XXXXXXX', 

SUM(
CASE 
WHEN s.product='YYYYYYY' 
THEN s.sales 
ELSE 0 
END 
) AS 'YYYYYYY', 

SUM(
CASE 
WHEN s.product='ZZZZZZZ' 
THEN s.sales 
ELSE 0 
END 
) AS 'ZZZZZZZ' 

FROM my_table s 
GROUP BY s.date; 
+0

@pawel: Это было полезно? –

+0

Данные, которые я предоставил, являются фрагментом таблицы. Acutal содержит несколько сотен продуктов. Таким образом, жестко закодированные случаи не доберутся до меня, насколько я ожидал. –

+0

@PawelPogorzelski: Думаю, теперь это должно помочь. –

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