#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. Отличное решение! Спасибо!