2013-12-19 6 views
0

Привет, я хочу отобразить запись в формате, как показано ниже. Как отобразить формат, как показано ниже?SQL group join table

Branch Total Payment Total Discount Total Net Payment 
A   10,000   2,000   8,000 
B   29,190   1,540   27,656 

Вот мой запрос на вышесказанное. Пожалуйста, помогите мне. Благодарю.

SELECT TranID, ProjCode, 
CASE WHEN IsActive='N' THEN 'Cancellation' ELSE PaymentType END As PaymentType, 
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, 
CASE WHEN IsActive='N' THEN Net ELSE 0 END As Cancellation, 
CASE WHEN IsActive='N' THEN Net_Before_CutOff ELSE 0 END As Cancellation_Before_CutOff, 
CASE WHEN IsActive='N' THEN 0 ELSE Discount END As Discount, 
CASE WHEN IsActive='N' THEN 0 ELSE Discount_Before_CutOff END As Discount_Before_CutOff, AdditionalCommission,AdditionalCommission_Before_CutOff, Remark, UserStamp, BusinessDay, 
TranDate, BranchID, StaffCode, IsActive,Quantity 
FROM    
(SELECT c.INTERNAL_TRAN_NUM AS TranID, c.PROJECT_CODE AS ProjCode, c.PAYMENT_TYPE AS PaymentType,d.QUANTITY As Quantity, 
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, 
CASE WHEN DATEPART(hh, c.TRAN_DATE)> DATEPART(hh, f.CUT_OFF_TIME) THEN c.NET_PAYMENT ELSE 0 END AS Net, 
CASE WHEN DATEPART(hh, c.TRAN_DATE) <= DATEPART(hh,f.CUT_OFF_TIME) THEN c.NET_PAYMENT ELSE 0 END AS Net_Before_CutOff, 
CASE WHEN DATEPART(hh, c.TRAN_DATE) > DATEPART(hh,f.CUT_OFF_TIME) THEN c.DISCOUNT_AMOUNT ELSE 0 END AS Discount, 
CASE WHEN DATEPART(hh, c.TRAN_DATE) <= DATEPART(hh,f.CUT_OFF_TIME) THEN c.DISCOUNT_AMOUNT ELSE 0 END AS Discount_Before_CutOff, 
CASE WHEN DATEPART(hh, c.TRAN_DATE) > DATEPART(hh, f.CUT_OFF_TIME) THEN d.USER_DEF8 ELSE 0 END As AdditionalCommission, 
CASE WHEN DATEPART(hh, c.TRAN_DATE) <= DATEPART(hh, f.CUT_OFF_TIME) THEN d.USER_DEF8 ELSE 0 END As AdditionalCommission_Before_CutOff, 
c.REMARKS AS Remark, c.USER_STAMP AS UserStamp,CAST(DATEADD(hh, - DATEPART(hh, f.CUT_OFF_TIME), c.TRAN_DATE) AS DATE) AS BusinessDay, 
c.TRAN_DATE AS TranDate, e.BRANCH_ID AS BranchID, d.STAFF_CODE AS StaffCode, c.ISACTIVE AS IsActive 
FROM SC_TRAN_HEADER AS c 
INNER JOIN SC_TRAN_DETAIL AS d ON d.INTERNAL_TRAN_NUM = c.INTERNAL_TRAN_NUM 
INNER JOIN SC_BRANCH AS e ON c.BRANCH_NUM = e.INTERNAL_NUM 
INNER JOIN SC_COMMISSION AS f ON f.BRANCH_NUM = c.BRANCH_NUM) AS TMP 
+0

Вопрос: Запрос не дает результатов, которые вы намереваетесь, хотя вы говорите, что это так. –

+0

@ Gordon Linoff. Вышеприведенный запрос неполный, но я намерен произвести вывод, как указано выше. Вы знаете, как работает – user3051461

ответ

1

Самое лучшее, что я могу придумать, основываясь на информации в вашем вопросе, является:

with cte as (<your query here>) 
select branchid, sum(sale) as payment, sum(discount) as discount, 
     sum(sale) - sum(discount) 
from cte 
group by branchid; 

Если это не так, то изменить свой вопрос, чтобы обеспечить дополнительную информацию, чтобы помочь решить ваш вопрос.

+0

. спасибо – user3051461

0

ПЕРВЫЙ, я попытался бы упростить читабельность этого запроса из всех условий 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 
+0

Thx он решает уже – user3051461