Сумма разных сумм

#mysql #sql

#mysql #sql

Вопрос:

Привет, сообщество,

У меня проблемы с объединением значения 3 разных запросов суммы. У нас есть таблица с несколькими столбцами, например: customer_id, amount_hours, start_date, end_date, one_time .

Есть 3 разные категории / условия для их суммирования.

  1. значение one_time равно true

  2. значение end_date равно нулю, а значение one_time равно false

  3. значение end_date не равно нулю, а one_time равно false

Я выполнил эти 3 запроса. Они работают отлично. Теперь я хочу добавить результаты в один столбец рядом с customer_id, конечно. Таблица представляет собой количество «свободных часов» (извините, английский не мой родной язык, и я не могу придумать лучшего выражения). Либо клиент купил определенную сумму в качестве единовременного платежа, либо у него есть контракт, который добавляет количество X часов в месяц.

Допустим, клиент случайного магазина купил 20 часов в качестве единовременного платежа, заплатил весь прошлый год за 5 часов в месяц и в течение этого текущего года изменил его на 8 часов в месяц. Тогда нужно было бы суммировать 20 (12 месяцев * 5 часов = 60) (8 месяцев {как сейчас август} * 8 часов = 64) = 144.

Пока я получил 3 запроса, чтобы получить 20, 60 и 64. Но если я попробую что-то вроде select sum ((select sum(....) select sum(....) select sum(....)) , то это не сработает. Я получаю синтаксические ошибки, и у меня такое чувство, что я пытаюсь сделать что-то, что просто не соответствует тому, как должна выглядеть правильная структура синтаксиса, добавляя три разных запроса суммы. Пытался погуглить, не повезло. Может кто-нибудь помочь?

1-я сумма:

 select sum (amount_hours) from [myTable] where customer_id=100112 AND one_time= 'True'
  

2-я сумма:

 select sum ((datediff(month, Start_Date, End_Date) 1)* amount_hours) from [myTable] where customer_id = 100112 AND one_time = 'False' and end_date is not NULL
  

3-я сумма:

 select sum ((datediff(month, Start_Date, Getdate()) 1) * amount_hours) from [myTable] where customer_id = 100112 AND one_time = 'False' and end_date is NULL
  

Мои образцы специально включают customer_id. Позже обойдемся без них и группы.

Ответ №1:

1.значение one_time равно true

2.значение end_date равно нулю, а значение one_time равно false

3.значение end_date не равно нулю, а one_time равно false

Никаких проблем.

 SELECT customer_id, 
       SUM(CASE WHEN one_time = 'True'
                THEN amount_hours 
                END) sum1,
       SUM(CASE WHEN end_date IS NULL and one_time = 'False'
                THEN (DATEDIFF(MONTH, Start_Date, End_Date)   1) * amount_hours 
                END) sum2,
       SUM(CASE WHEN end_date IS NOT NULL and one_time = 'False'
                THEN (DATEDIFF(MONTH, Start_Date, Getdate())   1) * amount_hours
                END) sum3
FROM myTable
GROUP BY customer_id
  

Вы можете добавить ELSE 0 в случаи, если это необходимо.

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

1. Извините, кажется, я недостаточно хорошо объяснил себя. Когда я ввожу это, я получаю customer_id, а затем sum1, sum2, sum3 в качестве столбцов. Но нужен только customer_id и сумма других 3 столбцов. Таким образом, всего 2 столбца, один из которых является customer_id.

2. Вы можете просто заменить «sum1», «sum2″ на » «, чтобы иметь customer_id, SUM(...) SUM(...) SUM(...)

3. Спасибо @Pepper Тем временем я решил это, используя одну сумму (случай с WHEN {condition1} ЗАТЕМ, КОГДА {условие2} ЗАТЕМ, КОГДА {условие3} ТОГДА тоже так работало. У Акины была путаница в логике, поскольку GetDate() следует использовать, если end_date равно НУЛЮ (не тогда, когда оно НЕ равно НУЛЮ). Итак, мои ожидаемые результаты не соответствовали, и я совсем запутался. В любом случае, оба ваших ответа помогли мне разобраться. Спасибо!!!