Как группировать таблицу из строки как месяца в поле как месяц, но группировать по идентификатору, поэтому этот запрос группируется по 2 полям, но строка становится полем?

Это данные:

enter image description here

Если изображение выше не отображается ниже, это вспомогательная информация:

У меня есть такая транзакция таблицы:

Id| Id_product  | Month | Value |
 ________________________________
 1| 1           | 6     | 5     |
 2| 1           | 6     | 5     |
 3| 3           | 7     | 4     |
 4| 7           | 8     | 1     |
 5| 5           | 8     | 2     |
 6| 5           | 8     | 1     |
 7| 1           | 8     | 1     | 

Я хочу сгруппировать все эти данные с двумя полями, идентификатором продукта, но сгруппировать по месяцу, а месяц быть полем,

    Id_product  | Month6       | Month7 | Month8       |
 ______________________________________________________
    1           | 10 (id1+id2) |        | 1 (id7)      |
    3           |              | 4(id3) |              |
    7           |              |        | 1 (id4)      |
    5           |              |        | 3 (id5 + id6)| 
1
haris j 7 Окт 2020 в 05:37

2 ответа

Лучший ответ

В подзапросе нет необходимости.
Вы можете напрямую использовать условную агрегацию:

SELECT id_product,
       SUM((Month = 1) * Value) Month1,
       SUM((Month = 2) * Value) Month2,
       SUM((Month = 3) * Value) Month3,
       SUM((Month = 4) * Value) Month4,
       SUM((Month = 5) * Value) Month5,
       SUM((Month = 6) * Value) Month6,
       SUM((Month = 7) * Value) Month7,
       SUM((Month = 8) * Value) Month8,
       SUM((Month = 9) * Value) Month9,
       SUM((Month = 10) * Value) Month10,
       SUM((Month = 11) * Value) Month11,
       SUM((Month = 12) * Value) Month12
FROM transaction
GROUP BY id_product

См. демонстрацию.
Полученные результаты:

> id_product | Month1 | Month2 | Month3 | Month4 | Month5 | Month6 | Month7 | Month8 | Month9 | Month10 | Month11 | Month12
> ---------: | -----: | -----: | -----: | -----: | -----: | -----: | -----: | -----: | -----: | ------: | ------: | ------:
>          1 |      0 |      0 |      0 |      0 |      0 |     10 |      0 |      1 |      0 |       0 |       0 |       0
>          3 |      0 |      0 |      0 |      0 |      0 |      0 |      4 |      0 |      0 |       0 |       0 |       0
>          5 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      3 |      0 |       0 |       0 |       0
>          7 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      1 |      0 |       0 |       0 |       0
1
forpas 7 Окт 2020 в 07:27

В году 12 месяцев ... учитывая, что как фиксированное предположение, следующее может быть решением,

select id_product,
sum(month1),sum(month2),sum(month3),sum(month4),sum(month5),sum(month6),sum(month7),sum(month8),sum(month9),sum(month10),sum(month11),sum(month12)
from
    (select id_product,
    case when `month`= 1  then value else 0 end month1,
    case when `month`= 2  then value else 0 end month2, 
    case when `month`= 3  then value else 0 end month3, 
    case when `month`= 4  then value else 0 end month4, 
    case when `month`= 5  then value else 0 end month5, 
    case when `month`= 6  then value else 0 end month6, 
    case when `month`= 7  then value else 0 end month7, 
    case when `month`= 8  then value else 0 end month8, 
    case when `month`= 9  then value else 0 end month9, 
    case when `month`= 10  then value else 0 end month10,
    case when `month`= 10  then value else 0 end month11,
    case when `month`= 10  then value else 0 end month12
    from sfmonthquery) as T 
group by id_product
1
Shoaeb 7 Окт 2020 в 05:11