ПЕРВЫЙ, я попытался бы упростить читабельность этого запроса из всех условий case/when. Во-первых, вы делаете случай/когда в своем предварительном запросе на повторные тесты должны пройти до и после периода отсечения, а затем другие, которые вы делаете, основываясь на снятии или снятии НЕТ, и снова для активных против неактивных.
Простые множители математики ... рассмотрим ваш сегмент запросов ... ваш внутренний запрос, чтобы получить значения Sale and Sale_Before_CutOff.
CASE WHEN DATEPART(hh,c.TRAN_DATE) > DATEPART(hh, f.CUT_OFF_TIME) THEN c.TOTAL_PAYMENT ELSE 0 END AS Sale,
CASE WHEN DATEPART(hh, c.TRAN_DATE)<= DATEPART(hh, f.CUT_OFF_TIME) THEN c.TOTAL_PAYMENT ELSE 0 END AS Sale_Before_CutOff,
Оба проверяют дату на время отсечки, и ответ может быть До или После, ни один из них. Вы выполняете те же тесты для Net, Net_Before_Cutoff, Withdrawal, Withdrawal_Before_Cutoff.
CASE WHEN PaymentType='Withdrawal' THEN 0 ELSE (CASE WHEN IsActive='N' THEN 0 ELSE Net END) END As Net ,
CASE WHEN PaymentType='Withdrawal' THEN 0 ELSE (CASE WHEN IsActive='N' THEN 0 ELSE Net_Before_CutOff END) END As Net_Before_CutOff ,
CASE WHEN PaymentType='Withdrawal' THEN Net ELSE 0 END As Withdrawal,
CASE WHEN PaymentType='Withdrawal' THEN Net_Before_CutOff ELSE 0 END As Withdrawal_Before_CutOff,
ТОГДА, в основной части запроса, вы подаете еще раз вложенный случай/когда (случай/когда)
CASE WHEN PaymentType='Withdrawal' THEN 0 ELSE (CASE WHEN IsActive='N' THEN 0 ELSE Sale END) END As Sale ,
CASE WHEN PaymentType='Withdrawal' THEN 0 ELSE (CASE WHEN IsActive='N' THEN 0 ELSE Sale_Before_CutOff END) END As Sale_Before_CutOff ,
CASE WHEN PaymentType='Withdrawal' THEN 0 ELSE (CASE WHEN IsActive='N' THEN 0 ELSE Net END) END As Net ,
CASE WHEN PaymentType='Withdrawal' THEN 0 ELSE (CASE WHEN IsActive='N' THEN 0 ELSE Net_Before_CutOff END) END As Net_Before_CutOff ,
CASE WHEN PaymentType='Withdrawal' THEN Net ELSE 0 END As Withdrawal,
CASE WHEN PaymentType='Withdrawal' THEN Net_Before_CutOff ELSE 0 END As Withdrawal_Before_CutOff,
Что я хотел бы сделать, это из ваших подзапросов квалификационных записей , Я бы получил столбцы сырой суммы и шесть флагов, чтобы действовать как умножители.
SELECT ...
c.TOTAL_PAYMENT,
c.Net_Payment,
c.Discount_Amount,
CASE WHEN DATEPART(hh,c.TRAN_DATE) > DATEPART(hh, f.CUT_OFF_TIME)
THEN 1 ELSE 0 END as AfterMult,
CASE WHEN DATEPART(hh,c.TRAN_DATE) > DATEPART(hh, f.CUT_OFF_TIME)
THEN 0 ELSE 1 END as BeforeMult,
CASE WHEN c.PaymentType='Withdrawal'
THEN 1 ELSE 0 END as WithdrawalMult,
CASE WHEN c.PaymentType='Withdrawal'
THEN 0 ELSE 1 END as NotAWithdrawalMult,
CASE WHEN c.IsActive='N'
THEN 1 ELSE 0 END As NotActiveMult,
CASE WHEN c.IsActive='N'
THEN 0 ELSE 1 END As ActiveMult, ...
Обратите внимание, то же условие применяется к обеим частям, только THEN/ELSE меняет множитель от 1 до 0, соответственно тому, что он должен представлять. Таким образом, для любой записи, например, результат был бы
Total_Payment Net_Payment Discount_Amount AfterMult BeforeMult WithdrawalMult NotAWithdrawalMult NotActiveMult ActiveMult
100 86 14 1 0 1 0 0 1
200 170 30 0 1 0 1 1 0
Теперь простые мысли ... если вы хотите знать, сколько общая сумма выплат были до отсечки и были НЕ withdrawls, в вашем верхнем запросе было бы
Total_Payment * BeforeMult * NotAWithdrawal = TotalPayments_BeforeCutoff
против платежей после выключения
Total_Payment * AfterMult * NotAWithdrawal = TotalPayments_BeforeCutoff
Аналогичные соображения для активных против не активен. Используйте этот множитель, не имея смысла делать вложенные случаи, когда вы уже определили его статус при извлечении записей. Давайте посмотрим на столбце «Продажи» ... Внутренний запрос получает запись использует поле «Total_Payment»
CASE WHEN DATEPART(hh,c.TRAN_DATE) > DATEPART(hh, f.CUT_OFF_TIME) THEN c.TOTAL_PAYMENT ELSE 0 END AS Sale,
затем в верхнем вложенный случае/когда.
CASE WHEN PaymentType='Withdrawal' THEN 0 ELSE (CASE WHEN IsActive='N' THEN 0 ELSE Sale END) END As Sale ,
Единственный раз, когда вы заботитесь о сумме продажи, когда он после обрезания, это не уход, а когда он активен, поэтому просто умножьте эти флаги
Total_Payment * AfterMult * NotAWithdrawalMult * ActiveMult as Sale
Total_Payment * BeforeMult * NotAWithdrawalMult * ActiveMult as Sale_Before_Cutoff
Наконец, у вас есть поэтому многие другие столбцы в таблице вытягиваются и не используются, зачем их хранить. И за то, что вы пытаетесь получить SUM() из, его будет гораздо легче читать что-то вроде
SUM(Total_Payment * AfterMult * NotAWithdrawalMult * ActiveMult) as TotalSale
SUM(Total_Payment * BeforeMult * NotAWithdrawalMult * ActiveMult) as TotalSale_Before_Cutoff
Все, что было сказано, я предлагаю вам это ... Пожалуйста, подтвердите контекст, но должен иметь смысл сверху. Кроме того, обратите внимание, что последние 3 столбца, которые я добавил, были итоговой суммой, которую вы, вероятно, ищете, где суммирование не волнует до или после отключения времени ... просто факт, что это действительный платеж/скидка/сеть, был Активен, и на двух из них не было вывода ... Видя это, вам нужно будет подтвердить его точность. Первые 6 суммирования показаны на основе соответствующих после обрезания (без суффикса имени столбца) по сравнению с отключением (название столбца имеет суффикс)
SELECT
PQ.Branch_Name, <-- CONFIRM COLUMN FROM PreQuery (PQ alias)
SUM(PQ.Total_Payment * PQ.AfterMult * PQ.NotAWithdrawalMult * PQ.ActiveMult) as TotalSale,
SUM(PQ.Total_Payment * PQ.BeforeMult * PQ.NotAWithdrawalMult * PQ.ActiveMult) as TotalSale_BeforeCutoff,
SUM(PQ.Discount_Amount * PQ.AfterMult * PQ.ActiveMult) as TotalDiscount,
SUM(PQ.Discount_Amount * PQ.BeforeMult * PQ.ActiveMult) as TotalDiscount_BeforeCutoff,
SUM(PQ.Net_Payment * PQ.AfterMult * PQ.NotAWithdrawalMult * PQ.ActiveMult) as Net,
SUM(PQ.Net_Payment * PQ.BeforeMult * PQ.NotAWithdrawalMult * PQ.ActiveMult) as Net_BeforeCutoff,
SUM(PQ.Total_Payment * PQ.NotAWithdrawalMult * PQ.ActiveMult) as TotalSaleAll,
SUM(PQ.Discount_Amount * PQ.ActiveMult) as TotalDiscountAll,
SUM(PQ.Net_Payment * PQ.NotAWithdrawalMult * PQ.ActiveMult) as NetAll
from
(select
e.Branch_Name, <-- GUESSING ON THIS COLUMN FOR ACTUAL BRANCH
c.Total_Payment,
c.Net_Payment,
c.Discount_Amount,
CASE WHEN DATEPART(hh,c.TRAN_DATE) > DATEPART(hh, f.CUT_OFF_TIME)
THEN 1 ELSE 0 END as AfterMult,
CASE WHEN DATEPART(hh,c.TRAN_DATE) > DATEPART(hh, f.CUT_OFF_TIME)
THEN 0 ELSE 1 END as BeforeMult,
CASE WHEN c.PaymentType='Withdrawal'
THEN 1 ELSE 0 END as WithdrawalMult,
CASE WHEN c.PaymentType='Withdrawal'
THEN 0 ELSE 1 END as NotAWithdrawalMult,
CASE WHEN c.IsActive='N'
THEN 1 ELSE 0 END As NotActiveMult,
CASE WHEN c.IsActive='N'
THEN 0 ELSE 1 END As ActiveMult
FROM
SC_TRAN_HEADER AS c
INNER JOIN SC_TRAN_DETAIL AS d
ON c.INTERNAL_TRAN_NUM = d.INTERNAL_TRAN_NUM
INNER JOIN SC_BRANCH AS e
ON c.BRANCH_NUM = e.INTERNAL_NUM
INNER JOIN SC_COMMISSION AS f
ON c.BRANCH_NUM = f.BRANCH_NUM) AS PQ
group by
PQ.Branch_Name <-- AGAIN, confirm column name here
Вопрос: Запрос не дает результатов, которые вы намереваетесь, хотя вы говорите, что это так. –
@ Gordon Linoff. Вышеприведенный запрос неполный, но я намерен произвести вывод, как указано выше. Вы знаете, как работает – user3051461