SQL Buckets Determine Age Grouping - sql

I have a database with legacy data that stores transactions and uses a "bucket" method for determining account balances. I need a way to get aged past due for accounts.
Table Transactions
TransactionId
TransactionType (CHARGE,RECEIPT)
Amount
PostDate
To get the current balance:
SELECT SUM(CASE TransactionTypeId WHEN RECEIPT THEN Amount * -1 ELSE Amount END) CurrentBalance
I need a way to determine past due 30, 60, 90, 120, etc:
Account Current 30 60 90 120+
12345 $50.00 $0.00 $25.00 $25.00 $0.00
I tried running separate queries and limiting the CHARGE postdates to greater than 30,60,90,120, running for each group and subtracting the others, etc but cannot get the expected results.
The table doesn't store a flag for past due, all balances are calculated on the fly.
Am I missing something simple? I tried a net search but not sure if there's a term for this type of sql query.
Database is SQL Server if that helps.
TIA

You could use an additional clause in the case to filter out transactions from the last 30 days. For example:
SELECT
SUM(
CASE WHEN TransactionTypeId = 'RECEIPT' THEN -Amount
ELSE Amount
END) as CurrentDue
, SUM(CASE WHEN datediff(d,PostDate,getdate()) <= 30 THEN 0
WHEN TransactionTypeId = 'RECEIPT' THEN -Amount
ELSE Amount
END) as PastDue30
, ...
FROM Transactions
To just exclude charges from the past 30 days, swap the when clauses:
, SUM(CASE WHEN TransactionTypeId = 'RECEIPT' THEN -Amount
WHEN datediff(d,PostDate,getdate()) <= 30 THEN 0
ELSE Amount
END) as PastDue30

This is what I ended up with, something that I had from before, but was missing the checks for when the amount due is zero, as well as checking if the prior group had a negative value. I had to add them because I was getting strange results, say if the account was overpaid for a service, which would have a negative due for the prior period.
SELECT
ServiceId,
AmountDue PastDue,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue60 < 0 THEN 0 ELSE AmountDue30 - AmountDue60 END END PastDue30,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue90 < 0 THEN 0 ELSE AmountDue60 - AmountDue90 END END PastDue60,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue120 < 0 THEN 0 ELSE AmountDue90 - AmountDue120 END END PastDue90,
CASE AmountDue WHEN 0 THEN 0 ELSE CASE WHEN AmountDue120 < 0 THEN 0 ELSE AmountDue120 END END PastDue120
FROM
(
SELECT T.ServiceId,
SUM(CASE WHEN T.TransactionTypeId = #Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = #Charge THEN T.TAmount ELSE 0 END) AmountDue,
SUM(CASE WHEN T.TransactionTypeId = #Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = #Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, #TPostDate) >= 30 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue30,
SUM(CASE WHEN T.TransactionTypeId = #Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = #Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, #TPostDate) >= 60 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue60,
SUM(CASE WHEN T.TransactionTypeId = #Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = #Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, #TPostDate) >= 90 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue90,
SUM(CASE WHEN T.TransactionTypeId = #Receipt THEN T.TAmount * -1 WHEN T.TransactionTypeId = #Charge THEN CASE WHEN DATEDIFF(D, T.TPostDate, #TPostDate) >= 120 THEN T.TAmount ELSE 0 END ELSE 0 END) AmountDue120
FROM Transactions T
WHERE T.AccountId = #AccountId
GROUP BY T.ServiceId
) AB

Related

Query % of x item based on x+y total

I'm running a SQL command which returns me the following table
What I need now, is to retrieve how much % corretiva is from total, and how much % preventiva is from total for each month, so there must be another 2 columns like preventivas% and corretivas% as example, I know MES.1 (month 1), will return preventiva =100%, and corretiva = 0%,
This is my query
SELECT
MONTH(workOrderDate) AS MES,
(SUM(CASE WHEN WorkType = '02' AND workOrderDescription = 'preventiva' THEN 1.0 ELSE 0 END)) AS preventiva,
(SUM(CASE WHEN workOrderDescription = 'CORRETIVA' THEN 1 ELSE 0 END)) AS corretivas,
SUM(CASE WHEN WorkType = '02' AND workOrderDescription = 'preventiva' THEN 1.0 ELSE 0 END + CASE WHEN workOrderDescription = 'CORRETIVA' THEN 1 ELSE 0 END) AS total
FROM
WorkOrder
WHERE
YEAR(workOrderDate) = 2018
AND lastUpdateData IS NOT NULL
GROUP BY
MONTH(workOrderDate);
I can't seem to figure out how to achieve the wanted result, would anyone please help me?
Thanks!
You can take your existing query, put it into a CTE, and then calculate your percentages in the main SELECT, like this:
;WITH subresults AS
(
SELECT
MES = MONTH(workOrderDate)
,preventiva = ( SUM(CASE WHEN WorkType = '02'
AND workOrderDescription = 'preventiva'
THEN 1.0
ELSE 0 END
)
)
,corretivas = ( SUM(CASE WHEN workOrderDescription = 'CORRETIVA' THEN 1 ELSE 0 END))
,total = SUM(CASE WHEN WorkType = '02'
AND workOrderDescription = 'preventiva'
THEN 1.0
ELSE 0 END + CASE WHEN workOrderDescription = 'CORRETIVA' THEN 1 ELSE 0 END
)
FROM WorkOrder
WHERE
YEAR(workOrderDate) = 2018
AND lastUpdateData IS NOT NULL
GROUP BY MONTH(workOrderDate)
)
SELECT
s.MES
,s.preventiva
,s.corretivas
,s.total
,preventivasPct = CASE WHEN s.total <> 0 THEN (s.preventiva / s.total) * 100.0 ELSE NULL END
,corretivasPct = CASE WHEN s.total <> 0 THEN (s.corretivas / s.total) * 100.0 ELSE NULL END
FROM subresults s
EDIT: I added CASE statements to preventivasPct and corretivasPct. When the total is 0, the CASE will return NULL. Feel free to change NULL to some other value if you want. I've found that usually 0 or NULL is the correct answer when encountered with divide-by-zero when calculating percentages.

Add two sum case statements that are of a negative value

I am trying to add two select statements with onyl negative values, these are the statements:
SUM(CASE WHEN LinkAcc = '8420000' THEN amount < 0 END)
SUM(CASE WHEN LinkAcc = '8400000' THEN amount < 0 END) AS Payments
I have tried :
SUM(CASE WHEN LinkAcc = '8400000,8420000' THEN amount < 0 END) AS Payments
THEN amount < 0 doesn't make much sense. If I understood you correctly, what you want is:
SUM(CASE
WHEN LinkAcc IN ('8420000','8400000') AND amount < 0
THEN amount
END) As Payments

Update a complex SQL query to add a new column with the sum of two columns

The below SQL query creates a table with n number of columns named in the next line.
...., curr_amount, tax_amount, ....
I am having a very tough time updating the below query to create a new column called total and position it exactly after tax_amount column and the total column should contain the values that are obtained after sum of curr_amount & tax_amount.
I have been working on this from more than one day but couldn't figure it out.
P.S. Still a noob here. Thanks alot for your time.
.
SELECT Isnull(t.total_month, 'Total') total_month,
t.tax_amount,
t.curr_amount,
t.usage_qty,
t.kh_qty,
t.bill_cnt
FROM (SELECT dbo.Sigmadf(bm.posted_date, 'YYYY-MM') total_month,
Sum(CASE
WHEN rr.usage_qty IS NULL THEN 0
ELSE Cast (rr.usage_qty AS NUMERIC(18, 2))
END) usage_qty,
Sum(CASE
WHEN bm.curr_amount IS NULL THEN 0
ELSE bm.curr_amount
END) curr_amount,
Sum(CASE
WHEN bm.adj_amount IS NULL THEN 0
ELSE bm.adj_amount
END) adj_amount,
Sum(CASE
WHEN bm.bal_fwd_amount IS NULL THEN 0
ELSE bm.bal_fwd_amount
END) bal_forward,
Sum(CASE
WHEN bm.tax_amount IS NULL THEN 0
ELSE bm.tax_amount
END) tax_amount,
Sum(CASE
WHEN bm.due_amount IS NULL THEN 0
ELSE bm.due_amount
END) due_amount,
Sum(CASE
WHEN bm.last_total_paid_amount IS NULL THEN 0
ELSE bm.last_total_paid_amount * -1
END) paid_amount,
Sum(CASE
WHEN bm.bill_print = 'Y' THEN 1
ELSE 0
END) pdf_cnt,
Sum(CASE
WHEN Isnull(bm.bill_handling_code, '0') = '0' THEN 1
ELSE 0
END) reg_cnt,
Sum(CASE
WHEN Isnull(bm.bill_handling_code, '0') = '1' THEN 1
ELSE 0
END) ftime_cnt,
Sum(CASE
WHEN Isnull(bm.bill_handling_code, '0') = '9999' THEN 1
ELSE 0
END) ltime_cnt,
Count(*) bill_cnt,
Sum(CASE
WHEN bill_status = '01' THEN 1
ELSE 0
END) canc_cnt,
Sum(CASE
WHEN bill_status = '01' THEN
CASE
WHEN rr.usage_qty IS NULL THEN 0
ELSE Cast (rr.usage_qty AS NUMERIC(18, 2))
END
ELSE 0
END) canc_usg,
Sum(CASE
WHEN vis.kh_qty IS NULL THEN 0
ELSE Cast(vis.kh_qty AS NUMERIC(18, 2))
END) kh_qty
FROM bill_master bm WITH (nolock)
INNER JOIN (SELECT bill_no,
Sum(CASE
WHEN vpb.recurr_charge_type IN ( 'T4',
'SLF' )
THEN
CASE
WHEN vpb.print_qty = 'Y'
AND vpb.usage_qty IS NOT NULL
THEN
Cast (vpb.usage_qty AS
NUMERIC(18, 2))
ELSE 0
END
ELSE 0
END) usage_qty
FROM v_print_bills_all vpb
GROUP BY bill_no) rr
ON rr.bill_no = bm.bill_no
LEFT OUTER JOIN vis_bill_master_cr vis WITH (nolock)
ON bm.bill_no = vis.bill_no
WHERE 1 = 1
AND dbo.Trunc(bm.posted_date) >= '20150101'
AND dbo.Trunc(bm.posted_date) <= '20151124'
AND bm.posted_date IS NOT NULL
AND bm.cust_id NOT IN (SELECT cc.code_type cust_id
FROM code_table cc WITH (nolock)
WHERE cc.code_tabname = 'RptExclCust'
AND cc.code_value = 'cust_id')
GROUP BY dbo.Sigmadf(bm.posted_date, 'YYYY-MM') WITH rollup)t
I must say that the explanation is not so clear.
From my understanding, you want the total of two columns.
So, wrap all your query between parenthesis, call it subQuery, and make the sum of the two columns on top:
SELECT subQuery.total_month as bill_date,
subQuery.curr_amount as amount,
subQuery.tax_amount tax,
subQuery.curr_amount + subQuery.tax_amount as [total],
...
FROM
(..your entire query here..) as subQuery

SQL group join table

Hi I want to display out the record in the format as below. How to I display the format as below ?
Branch Total Payment Total Discount Total Net Payment
A 10,000 2,000 8,000
B 29,190 1,540 27,656
Here are my query for the above. Please help me. Thanks.
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
The best that I can come up with, based on the information in your question, is:
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;
If this is not correct, then edit your question to provide more information to help resolve your question.
FIRST, I would try to simplify the readability of this query from all the case/when conditions. First, you do case/when in your preliminary query on repeated tests to get before and after cut-off period, then others you do based on withdrawal or NOT withdrawal and yet again for Active vs Not Active.
Simple math multipliers... consider your query segment... your inner query to get the values of 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,
Both test the date part for the cutoff time, and the answer can be Before, or After, never both. You do the same tests for 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,
THEN, in your main part of the query, you are applying yet again a nested case/when(case/when)
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,
What I would do, is from your subquery qualifying records, I would get the raw amount columns and 6 flags to act as multiplers.
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, ...
Notice, the same condition is applied to both parts, only the THEN/ELSE swaps the multiplier from a 1 to 0 respectively to what it should represent. So, for any given record, example result would be
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
Now, simple thoughts... if you want to know how much total payments were before a cutoff and were NOT withdrawls, in your upper query it would be
Total_Payment * BeforeMult * NotAWithdrawal = TotalPayments_BeforeCutoff
vs payments AFTER cutoff
Total_Payment * AfterMult * NotAWithdrawal = TotalPayments_BeforeCutoff
Similar consideration for your Active vs Not active. Use that multiplier, no sense in doing nested cases when you already have determined its status when pulling the records. Lets take a look at your "Sale" column... The inner query getting the record is using the "Total_Payment" field
CASE WHEN DATEPART(hh,c.TRAN_DATE) > DATEPART(hh, f.CUT_OFF_TIME) THEN c.TOTAL_PAYMENT ELSE 0 END AS Sale,
then in the upper is a nested case/when.
CASE WHEN PaymentType='Withdrawal' THEN 0 ELSE (CASE WHEN IsActive='N' THEN 0 ELSE Sale END) END As Sale ,
The only time you care about the sale amount is when it is AFTER the cutoff, is NOT a withdrawal and when it IS Active, so just multiply those flags
Total_Payment * AfterMult * NotAWithdrawalMult * ActiveMult as Sale
Total_Payment * BeforeMult * NotAWithdrawalMult * ActiveMult as Sale_Before_Cutoff
Finally, you have so many other columns in the table being pulled and not used, why keep them. And for what you are trying to get the SUM() of, its going to be much easier to read it something like
SUM( Total_Payment * AfterMult * NotAWithdrawalMult * ActiveMult ) as TotalSale
SUM( Total_Payment * BeforeMult * NotAWithdrawalMult * ActiveMult ) as TotalSale_Before_Cutoff
All that being said, I offer you this... please confirm context, but should make sense from above. Also, note, the last 3 column I added were the final total you are probably looking for where the summation did not care as to before or after the time cutoff... just the fact it was a valid payment/discount/net, was Active, and on two of them was NOT a withdrawal... Seeing this, you would need to confirm its accuracy. The first 6 summations show based on respective after cutoff (no column name suffix) vs BEFORE the cutoff (column name HAS the suffix)
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

SQL - Pivot/Unpivot?

I have a table in SQL Server 2008 in the format as below(simplified format) :
Date Miles Cost
I want to get a result like
Previous Week Current Week Variance
Miles
Cost
How can I achieve this? Do I need pivot/unpivot or what is the easiest and performance effective way to achieve this. Thanks.
SELECT 'Miles' AS Type, SUM(CASE WHEN date = lastweek THEN miles ELSE 0 END) as lastweek
, SUM(CASE WHEN date = thisweek THEN miles ELSE 0 END) as thisweek
SUM(CASE WHEN date = lastweek THEN miles ELSE 0 END) - SUM(CASE WHEN date = thisweek THEN miles ELSE 0 END) as variance
FROM yourtable
UNION
SELECT 'Cost' AS Type, SUM(CASE WHEN date = lastweek THEN cost ELSE 0 END) as lastweek
, SUM(CASE WHEN date = thisweek THEN cost ELSE 0 END) as thisweek
SUM(CASE WHEN date = lastweek THEN cost ELSE 0 END) - SUM(CASE WHEN date = thisweek THEN cost ELSE 0 END) as variance
FROM yourtable
This isn't 100% correct, but the syntax should be correct and should get you pretty close to what you're looking for