У меня есть таблица, содержащая общее количество продуктов, а также предварительно рассчитанную общую сумму.
Я могу СУММИНИРОВАТЬ, где Тип = Общая сумма, или СУММИНИРОВАТЬ, если тип IN (Продукт 1, Продукт 2, Продукт 3).
Однако мне нужно СУММИРОВАНИЕ GrandTotal минус Продукт 3. SUM where type is IN (Product 1, Product 2 ) не подойдет для моих целей.
, SUM(CASE WHEN Type = 'GrandTotal' THEN ( Rev )
-
WHEN Type = 'Product 3' THEN Rev
ELSE 0
END
) as GT_ExcPrdct3
Ответ, который я хочу получить: 190 -- 390-200.
@Адриан, это вопрос SQL
Какая СУБД? SQL Server, DB2, Oracle, ....?
Сохраняете ли вы предварительно рассчитанное значение? Такое слишком часто приводит к несогласованности данных. Вместо этого рассмотрите вид.
SUM(CASE WHEN Type = 'GrandTotal' THEN Rev WHEN Type = 'Product 3' THEN - Rev END)

Опустите или проигнорируйте GrandTotal и рассчитайте общую сумму напрямую.
SELECT SUM(Rev)
FROM mytable
WHERE Type <> 'Product3';
или
SELECT SUM(Rev)
FROM mytable
WHERE Type NOT IN ('Product3', 'GrandTotal');
Вам нужны две отдельные условные суммы
SUM(CASE WHEN Type = 'GrandTotal' THEN Rev END)
-
SUM(CASE WHEN Type = 'Product 3' THEN Rev END)
Я согласен с другими, что было бы лучше не хранить общую сумму, а рассчитывать ее при необходимости.
Для этого вы можете использовать ROLLUP или GROUPING SETS. Что именно должно произойти со столбцом Agent, неясно.
SELECT
CASE WHEN GROUPING(t.Type) = 1 THEN 'Grand Total' ELSE t.Type END AS Type,
t.Agent,
SUM(CASE WHEN Type <> 'Product 3' THEN Rev END) AS Rev
FROM YourTable t
GROUP BY GROUPING SETS (
(t.Type, t.Agent),
()
);
Спасибо обоим — @charlieface, ваше первое решение работает здесь. Я не смог исключить сохранение общей суммы без большой переделки. Существует множество предварительных агрегаций, которые выводят это, и это не так просто, как добавление продуктов 1 + 2, так что это работает хорошо. Спасибо!
Помните, что Stack Overflow – это не ваш любимый Excel?Go?Google? форум, а скорее сайт вопросов и ответов по всем вопросам, связанным с программированием. Поэтому всегда указывайте тег языка, на котором вы программируете, чтобы другим пользователям, знакомым с этим языком, было легче найти ваш вопрос. Посетите тур и прочитайте Как задать вопрос , чтобы получить дополнительную информацию о том, как работает этот сайт, а затем отредактируйте вопрос, добавив соответствующие теги.