#mysql #sql
#mysql #sql
Вопрос:
Привет, сообщество,
У меня проблемы с объединением значения 3 разных запросов суммы. У нас есть таблица с несколькими столбцами, например: customer_id, amount_hours, start_date, end_date, one_time
.
Есть 3 разные категории / условия для их суммирования.
-
значение one_time равно true
-
значение end_date равно нулю, а значение one_time равно false
-
значение 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 равно НУЛЮ (не тогда, когда оно НЕ равно НУЛЮ). Итак, мои ожидаемые результаты не соответствовали, и я совсем запутался. В любом случае, оба ваших ответа помогли мне разобраться. Спасибо!!!