Сумма Случай, когда оператор использует условие 1 минус условие 2

У меня есть таблица, содержащая общее количество продуктов, а также предварительно рассчитанную общую сумму.

Тип Агент Преподобный Продукт 1 Агент 1 100 Продукт 2 Агент 1 90 Продукт 3 Агент 1 200 Общий итог Агент 1 390

Я могу СУММИНИРОВАТЬ, где Тип = Общая сумма, или СУММИНИРОВАТЬ, если тип 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.

Помните, что Stack Overflow – это не ваш любимый Excel?Go?Google? форум, а скорее сайт вопросов и ответов по всем вопросам, связанным с программированием. Поэтому всегда указывайте тег языка, на котором вы программируете, чтобы другим пользователям, знакомым с этим языком, было легче найти ваш вопрос. Посетите тур и прочитайте Как задать вопрос , чтобы получить дополнительную информацию о том, как работает этот сайт, а затем отредактируйте вопрос, добавив соответствующие теги.

Adriaan 03.07.2024 14:15

@Адриан, это вопрос SQL

Paul 03.07.2024 15:07

Какая СУБД? SQL Server, DB2, Oracle, ....?

Andrew 03.07.2024 15:15

Сохраняете ли вы предварительно рассчитанное значение? Такое слишком часто приводит к несогласованности данных. Вместо этого рассмотрите вид.

jarlh 03.07.2024 15:34
SUM(CASE WHEN Type = 'GrandTotal' THEN Rev WHEN Type = 'Product 3' THEN - Rev END)
jarlh 03.07.2024 16:31
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Опустите или проигнорируйте 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, так что это работает хорошо. Спасибо!

Phil Tucker 03.07.2024 15:52

Другие вопросы по теме

Похожие вопросы

Получить строки в результате ненулевого запроса и в то же время подсчитать количество строк по столбцам, которые не попали, но они также не равны нулю
Вставьте ведущие пробелы, затем значение в столбец varchar(10)
Запрос Oracle SQL с использованием regexp_substr для получения строки между двумя строками
Создание строк входа и выхода из одной строки
Почему метод Timestamp.of() в java.sql неправильно преобразуется из LocalDateTime в java.time?
Как использовать индекс, если искомый столбец не индексирован, но имеет тот же порядок, что и индексированный первичный ключ
Как получить информацию о самоанализе движка SQLite через Rust SQLx?
Отобразить среднее количество дней между последней и предпоследней транзакцией клиента
Как запросить фрейм данных Snowpark с помощью SQL из Snowflake?
Как устранить ошибку «Ошибка компиляции SQL: объект SNOWPARK_TEMP_STAGE_FLGVIWVUC уже существует». проблема в снежинке?