Сводная двойная сумма

#sql #sql-server #tsql #pivot

#sql #sql-сервер #tsql #сводная

Вопрос:

Я использую этот выбор, чтобы получить сводную информацию о ценах столбцов. Это нормально, но я также хочу выполнить суммирование для столбцов M1, M2 и M3, M4.

 SELECT *,25 M1Cijena, 25 M2Cijena, 16 M3Cijena, 16 M4Cijena
FROM (
    select u.pin Pin,u.firstname Name,u.lastname,sum(tmt.Price) Prices, tmt.type MealType
    from TA_Meals tm
    left outer join TA_MealsType tmt
    on tm.MealType = tmt.id     
    full outer join users u
    on u.pin = tm.pin
    where u.department = 1000001001
    group by u.pin,u.firstname,u.lastName,tmt.Type  
) as s
PIVOT
(
    SUM(Prices)
    FOR MealType IN (M1,M2,M3,M4)  **<-- here also want sum for M1,M2 and M3,M4.**

)AS pvt
  

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

1. Я использую SQL Server

2. Конечно, вы можете просто сложить суммы вместе в SELECT предложении? В прошлый раз, когда я проверял, SUM(M1 M2) и SUM(M1) SUM(M2) были получены те же результаты (исключая проблемы с обработкой null)

3. Я получаю нулевые значения.

Ответ №1:

Почему бы просто не использовать условную агрегацию?

 select u.pin, u.firstname, u.lastname,
      sum(case when tmt.type = 'M1' then tmt.Price end) as m1,
      sum(case when tmt.type = 'M2' then tmt.Price end) as m2,
      sum(case when tmt.type = 'M3' then tmt.Price end) as m3,
      sum(case when tmt.type = 'M4' then tmt.Price end) as m4,
      sum(case when tmt.type in ('M1', 'M2') then tmt.Price end) as m1_2,
      sum(case when tmt.type in ('M3', 'M4') then tmt.Price end) as m3_4
from users u left join
     TA_Meals tm
     on u.pin = tm.pin left join
     TA_MealsType tmt
     on tm.MealType = tmt.id join
where u.department = 1000001001
group by u.pin, u.firstname, u.lastName;
  

Обратите внимание, что я также исправил ваши объединения, чтобы они имели больше смысла. Использование where с внешними соединениями часто влияет на тип реализуемого соединения.

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

1. Отличное решение! Спасибо!