Как суммировать определенный столбец на основе значений других столбцов

#sql #sql-server

Вопрос:

У меня есть таблица с несколькими рабочими неделями, именами продуктов и именами событий. Вот пример:

 work_week     product_name  event_name         num_products         attributeA      attributeB
 2021-17         A            Event1               25                  Y                X         
 2021-17         A            Event1               20                  Y                Z
 2021-17         A            Event1               15                  N                Y
 

Я пытаюсь выполнить «группировку по» в этой таблице, чтобы получить сумму num_products, сгруппированных по work_week, product_name и event_name. Однако в моей таблице «группировка по» мне нужно несколько версий sum(num_products) в зависимости от значений attributeA и attributeB. Что-то вроде этого:

 work_week     product_name  event_name     sum_when_A = N     sum_when_A = Y and B = Z
  2021-17         A            Event1           15                      20                       
 

Есть какие-нибудь идеи о том, как это выполнить?

Ответ №1:

Просто используйте условную агрегацию:

 select work_week, product_name, event_name,
       sum(case when attributeA = 'N' then num_products else 0 end) as sum_n,
       sum(case when attributeA = 'Y' and attributeB = 'Z' then num_products else 0 end) as num_yz
from t
group by work_week, product_name, event_name;
 

Комментарии:

1. ах, «случай, когда» в пределах самой суммы. Вот и все, спасибо

Ответ №2:

Используйте условную агрегацию

 select work_week, product_name, event_name
, sum(iif(attributeA = 'N', num_products, 0))
, sum(iif(attributeA = 'Y' and attributeB = 'Z', num_products, 0))
from myTable
group by work_week, product_name, event_name