September 18, 2012 at 1:11 pm
SELECT SUM(AMOUNT) as SumAmount,TransType_ID,Transaction_AccNo
FROM Tbl_Transaction
Group By TransType_ID,Transaction_AccNo
below is the sql query result
SumAmount TransType_ID Transaction_AccNo
65000.00001
-35157.00031
-1872.23521
Question = i want to show only the Sum Amount With different TransType ID column and group by Acc No? ,example
SumAmount_TransType_ID_0 SumAmount_TransType_ID_3 SumAmount_TransType_ID_2 Transaction_AccNo
65000.000 -35157.000 -1872.235 1
how is the sql query??
September 18, 2012 at 2:08 pm
Hi
You could try the following. Of course it will only work for the three TransType_IDs
SELECT SUM(CASE WHEN TransType_ID = 0 THEN AMOUNT ELSE null END) SumAmount_TransType_ID_0
, SUM(CASE WHEN TransType_ID = 2 THEN AMOUNT ELSE null END) SumAmount_TransType_ID_2
, SUM(CASE WHEN TransType_ID = 3 THEN AMOUNT ELSE null END) SumAmount_TransType_ID_3
, Transaction_AccNo
FROM Tbl_Transaction
GROUP BY Transaction_AccNo
September 18, 2012 at 2:30 pm
SELECT
Tbl_Account.AccNo,
SUM( case when TransType_ID = 0 then Amount else 0 end ) as Total_Adjustment,
SUM( case when TransType_ID = 1 then Amount else 0 end ) as Total_Topup,
SUM( case when TransType_ID = 2 then Amount else 0 end ) as Total_Comm,
SUM( case when TransType_ID = 3 then Amount else 0 end ) as Total_Transfer,
SUM( case when TransType_ID = 4 then Amount else 0 end ) as Total_RecvTransfer,
SUM( case when TransType_ID = 2 AND Tbl_Topup.Topup_Company='M' then Amount else 0 end ) as Total_Maxis,
SUM( case when TransType_ID = 2 AND Tbl_Topup.Topup_Company='D' then Amount else 0 end ) as Total_Digi,
SUM( case when TransType_ID = 2 AND Tbl_Topup.Topup_Company='C' then Amount else 0 end ) as Total_Celcom,
(SELECT Top 1 Amount as Open_Balance)<<---how to do this at here?i want to get the first Amount as Opening Balance
FROM Tbl_Account
LEFT JOIN Tbl_Transaction ON Tbl_Account.AccNo = Tbl_Transaction.Transaction_AccNo AND (SELECT convert(Date,Tbl_Transaction.Transaction_Date, 105)) BETWEEN (SELECT convert(Date,'16-9-2012', 105)) AND (SELECT convert(Date,'30-9-2012', 105))
LEFT JOIN Tbl_Topup ON Tbl_Transaction.Topup_ID=Tbl_Topup.Topup_ID
Group By Tbl_Account.AccNo
ORDER BY Tbl_Account.AccNo
September 18, 2012 at 10:54 pm
i totally no idea with this,pls help~!
September 19, 2012 at 2:19 am
chinye2020 (9/18/2012)
...(SELECT Top 1 Amount as Open_Balance)<<---how to do this at here?i want to get the first Amount as Opening Balance...
Write a separate query for this, then integrate it into the main query. We'll help with that part.
The problem is, "the first Amount" isn't easily understood with the information we have so far. Do you mean the first transaction against an account within the specified date range?
In the meantime, here's your original query with two key improvements:
Table aliases used throughout
Date filter is now SARGable - if there's an index on transaction date, it can now be used.
SELECT
a.AccNo,
SUM( case when t.TransType_ID = 0 then a.Amount else 0 end ) as Total_Adjustment,
SUM( case when t.TransType_ID = 1 then a.Amount else 0 end ) as Total_Topup,
SUM( case when t.TransType_ID = 2 then a.Amount else 0 end ) as Total_Comm,
SUM( case when t.TransType_ID = 3 then a.Amount else 0 end ) as Total_Transfer,
SUM( case when t.TransType_ID = 4 then a.Amount else 0 end ) as Total_RecvTransfer,
SUM( case when t.TransType_ID = 2 AND p.Topup_Company='M' then a.Amount else 0 end ) as Total_Maxis,
SUM( case when t.TransType_ID = 2 AND p.Topup_Company='D' then a.Amount else 0 end ) as Total_Digi,
SUM( case when t.TransType_ID = 2 AND p.Topup_Company='C' then a.Amount else 0 end ) as Total_Celcom--,
--(SELECT Top 1 Amount as Open_Balance)<<---how to do this at here?i want to get the first Amount as Opening Balance
FROM Tbl_Account a
LEFT JOIN Tbl_Transaction t
ON a.AccNo = t.Transaction_AccNo
-- this date arithmetic should provide the same filter as the original
-- but is SARGable (use Google)
AND t.Transaction_Date > convert(Date,'16-9-2012', 105)
AND t.Transaction_Date < convert(Date,'01-10-2012', 105)
LEFT JOIN Tbl_Topup p ON t.Topup_ID = p.Topup_ID
Group By a.AccNo
ORDER BY a.AccNo
Edit: speling
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden
September 19, 2012 at 6:23 am
i mean select the top 1 Amount in the sql query
September 19, 2012 at 6:47 am
chinye2020 (9/19/2012)
i mean select the top 1 Amount in the sql query
Ordered by what? Amount? Transaction date?
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden
September 19, 2012 at 6:54 am
ChrisM@Work (9/19/2012)
chinye2020 (9/19/2012)
i mean select the top 1 Amount in the sql queryOrdered by what? Amount? Transaction date?
all Sum will according the TrasnType_ID and Acc No, so Result will show the all Acc No and their TransType Total Amount,
and i just want in the Tbl_Transaction where is Top 1 Amount and show the Top 1 Amount as Opening_Balance, that's all
September 19, 2012 at 7:10 am
with CTE as
(
SELECT
Transaction_AccNo,
Amount,
TransType_ID,
Topup_ID,
ROW_NUMBER() OVER(PARTITION BY Transaction_AccNo
ORDER BY convert(Date,Transaction_Date, 105)) as RowNum
from Tbl_Transaction
where convert(Date,Transaction_Date, 105) BETWEEN '2012-09-1' AND '2012-09-30'
)
select
Tbl_Account.AccNo,
SUM( case when TransType_ID = 0 then Amount else 0 end ) as Total_Adjustment,
SUM( case when TransType_ID = 1 then Amount else 0 end ) as Total_Topup,
SUM( case when TransType_ID = 2 then Amount else 0 end ) as Total_Comm,
SUM( case when TransType_ID = 3 then Amount else 0 end ) as Total_Transfer,
SUM( case when TransType_ID = 4 then Amount else 0 end ) as Total_RecvTransfer,
SUM( case when TransType_ID = 2 AND Tbl_Topup.Topup_Company='M' then Amount else 0 end ) as Total_Maxis,
SUM( case when TransType_ID = 2 AND Tbl_Topup.Topup_Company='D' then Amount else 0 end ) as Total_Digi,
SUM( case when TransType_ID = 2 AND Tbl_Topup.Topup_Company='C' then Amount else 0 end ) as Total_Celcom,
SUM( case when RowNum = 1 then Amount else 0 end) as Open_Balance
FROM Tbl_Account
LEFT JOIN CTE ON Tbl_Account.AccNo = CTE.Transaction_AccNo
LEFT JOIN Tbl_Topup ON CTE.Topup_ID = Tbl_Topup.Topup_ID
Group By Tbl_Account.AccNo
ORDER BY Tbl_Account.AccNo
DONE !, this is select Top 1 Amount,But how to select the LAST Amount as Closing_Balance?
September 19, 2012 at 7:21 am
SELECT
a.AccNo,
SUM( case when t.TransType_ID = 0 then t.Amount else 0 end ) as Total_Adjustment,
SUM( case when t.TransType_ID = 1 then t.Amount else 0 end ) as Total_Topup,
SUM( case when t.TransType_ID = 2 then t.Amount else 0 end ) as Total_Comm,
SUM( case when t.TransType_ID = 3 then t.Amount else 0 end ) as Total_Transfer,
SUM( case when t.TransType_ID = 4 then t.Amount else 0 end ) as Total_RecvTransfer,
SUM( case when t.TransType_ID = 2 AND p.Topup_Company='M' then t.Amount else 0 end ) as Total_Maxis,
SUM( case when t.TransType_ID = 2 AND p.Topup_Company='D' then t.Amount else 0 end ) as Total_Digi,
SUM( case when t.TransType_ID = 2 AND p.Topup_Company='C' then t.Amount else 0 end ) as Total_Celcom,
Option1.Open_Balance,
Option2.Open_Balance,
Option3.Open_Balance
FROM Tbl_Account a
LEFT JOIN Tbl_Transaction t
ON a.AccNo = t.Transaction_AccNo
-- this date arithmetic should provide the same filter as the original
-- but is SARGable (use Google)
AND t.Transaction_Date > convert(Date,'16-9-2012', 105)
AND t.Transaction_Date < convert(Date,'01-10-2012', 105)
LEFT JOIN Tbl_Topup p ON t.Topup_ID = p.Topup_ID
OUTER APPLY (-- first transaction of the date range, if there is one
SELECT TOP 1 Open_Balance = ti.Amount
FROM Tbl_Transaction ti
WHERE ti.Transaction_AccNo = a.AccNo -- outer ref
AND ti.Transaction_Date > convert(Date,'16-9-2012', 105)
AND ti.Transaction_Date < convert(Date,'01-10-2012', 105)
ORDER BY ti.Transaction_Date
) Option1
OUTER APPLY (-- largest value of a transaction, if there is one
SELECT TOP 1 Open_Balance = ti.Amount
FROM Tbl_Transaction ti
WHERE ti.Transaction_AccNo = a.AccNo -- outer ref
AND ti.Transaction_Date > convert(Date,'16-9-2012', 105)
AND ti.Transaction_Date < convert(Date,'01-10-2012', 105)
ORDER BY ti.Amount DESC
) Option2
CROSS APPLY ( -- SUM of all the amounts prior to date range
SELECT Open_Balance = SUM(ti.Amount)
FROM Tbl_Transaction ti
WHERE ti.Transaction_AccNo = a.AccNo -- outer ref
AND ti.Transaction_Date <= convert(Date,'16-9-2012', 105)
) Option3
Group By a.AccNo
ORDER BY a.AccNo
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden
September 19, 2012 at 7:24 am
chinye2020 (9/19/2012)
...
DONE !, this is select Top 1 Amount,But how to select the LAST Amount as Closing_Balance?
Performance will be very poor. What datatype is Tbl_Transaction.Transaction_Date?
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden
September 19, 2012 at 7:38 am
with CTE as
(
SELECT
Transaction_AccNo,
Amount,Before_Amount,After_Amount,
TransType_ID,
Topup_ID,
ROW_NUMBER() OVER(PARTITION BY Transaction_AccNo
ORDER BY Transaction_Date) as RowNum,
ROW_NUMBER() OVER(PARTITION BY Transaction_AccNo
ORDER BY Transaction_Date DESC) as LastRowNum
from Tbl_Transaction
where convert(Date,Transaction_Date, 105) BETWEEN '2012-09-16' AND '2012-09-30'
)
select
Tbl_Account.AccNo,
SUM( case when TransType_ID = 0 then Amount else 0 end ) as Total_Adjustment,
SUM( case when TransType_ID = 1 then Amount else 0 end ) as Total_Topup,
SUM( case when TransType_ID = 2 then Amount else 0 end ) as Total_Comm,
SUM( case when TransType_ID = 3 then Amount else 0 end ) as Total_Transfer,
SUM( case when TransType_ID = 4 then Amount else 0 end ) as Total_RecvTransfer,
SUM( case when TransType_ID = 2 AND Tbl_Topup.Topup_Company='M' then Amount else 0 end ) as Total_Maxis,
SUM( case when TransType_ID = 2 AND Tbl_Topup.Topup_Company='D' then Amount else 0 end ) as Total_Digi,
SUM( case when TransType_ID = 2 AND Tbl_Topup.Topup_Company='C' then Amount else 0 end ) as Total_Celcom,
SUM( case when RowNum = 1 then Before_Amount else 0 end) as Open_Balance,
SUM( case when LastRowNum = 1 then After_Amount else 0 end) as Close_Balance
FROM Tbl_Account
LEFT JOIN CTE ON Tbl_Account.AccNo = CTE.Transaction_AccNo
LEFT JOIN Tbl_Topup ON CTE.Topup_ID = Tbl_Topup.Topup_ID
Group By Tbl_Account.AccNo
ORDER BY Tbl_Account.AccNo
DONE!
September 19, 2012 at 7:58 am
chinye2020 (9/19/2012)
...
DONE!
That's not opening and closing balance - it's simply the amounts of the first and last transactions in the date range.
SELECT
a.AccNo,
t.Total_Adjustment,
t.Total_Topup,
t.Total_Comm,
t.Total_Transfer,
t.Total_RecvTransfer,
t.Total_Maxis,
t.Total_Digi,
t.Total_Celcom,
Option3.Open_Balance + t.TransactionsForPeriod AS ClosingBalance
FROM Tbl_Account a
LEFT JOIN (
SELECT
d.Transaction_AccNo,
SUM(d.Amount) AS TransactionsForPeriod,
SUM( case when d.TransType_ID = 0 then d.Amount else 0 end ) as Total_Adjustment,
SUM( case when d.TransType_ID = 1 then d.Amount else 0 end ) as Total_Topup,
SUM( case when d.TransType_ID = 2 then d.Amount else 0 end ) as Total_Comm,
SUM( case when d.TransType_ID = 3 then d.Amount else 0 end ) as Total_Transfer,
SUM( case when d.TransType_ID = 4 then d.Amount else 0 end ) as Total_RecvTransfer,
SUM( case when d.TransType_ID = 2 AND d.Topup_Company = 'M' then d.Amount else 0 end ) as Total_Maxis,
SUM( case when d.TransType_ID = 2 AND d.Topup_Company = 'D' then d.Amount else 0 end ) as Total_Digi,
SUM( case when d.TransType_ID = 2 AND d.Topup_Company = 'C' then d.Amount else 0 end ) as Total_Celcom
FROM (
SELECT
ti.Transaction_AccNo,
ti.TransType_ID,
p.Topup_Company,
Amount = SUM(ti.Amount)
FROM Tbl_Transaction ti
LEFT JOIN Tbl_Topup p ON p.Topup_ID = t.Topup_ID
WHERE ti.Transaction_Date >= convert(Date,'2012-09-1', 105)
AND ti.Transaction_Date < convert(Date,'2012-10-01', 105)
GROUP BY ti.Transaction_AccNo, ti.TransType_ID, p.Topup_Company
) d
GROUP BY d.Transaction_AccNo
) t
ON t.Transaction_AccNo = a.AccNo
OUTER APPLY ( -- SUM of all the amounts prior to date range
SELECT
Open_Balance = SUM(ti.Amount)
FROM Tbl_Transaction ti
WHERE ti.Transaction_AccNo = a.AccNo -- outer ref
AND ti.Transaction_Date < convert(Date,'2012-09-1', 105)
) Option3
ORDER BY a.AccNo
For fast, accurate and documented assistance in answering your questions, please read this article.
Understanding and using APPLY, (I) and (II) Paul White
Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden
September 19, 2012 at 8:55 am
ChrisM@Work (9/19/2012)
chinye2020 (9/19/2012)
...
DONE!
That's not opening and closing balance - it's simply the amounts of the first and last transactions in the date range.
SELECT
a.AccNo,
t.Total_Adjustment,
t.Total_Topup,
t.Total_Comm,
t.Total_Transfer,
t.Total_RecvTransfer,
t.Total_Maxis,
t.Total_Digi,
t.Total_Celcom,
Option3.Open_Balance + t.TransactionsForPeriod AS ClosingBalance
FROM Tbl_Account a
LEFT JOIN (
SELECT
d.Transaction_AccNo,
SUM(d.Amount) AS TransactionsForPeriod,
SUM( case when d.TransType_ID = 0 then d.Amount else 0 end ) as Total_Adjustment,
SUM( case when d.TransType_ID = 1 then d.Amount else 0 end ) as Total_Topup,
SUM( case when d.TransType_ID = 2 then d.Amount else 0 end ) as Total_Comm,
SUM( case when d.TransType_ID = 3 then d.Amount else 0 end ) as Total_Transfer,
SUM( case when d.TransType_ID = 4 then d.Amount else 0 end ) as Total_RecvTransfer,
SUM( case when d.TransType_ID = 2 AND d.Topup_Company = 'M' then d.Amount else 0 end ) as Total_Maxis,
SUM( case when d.TransType_ID = 2 AND d.Topup_Company = 'D' then d.Amount else 0 end ) as Total_Digi,
SUM( case when d.TransType_ID = 2 AND d.Topup_Company = 'C' then d.Amount else 0 end ) as Total_Celcom
FROM (
SELECT
ti.Transaction_AccNo,
ti.TransType_ID,
p.Topup_Company,
Amount = SUM(ti.Amount)
FROM Tbl_Transaction ti
LEFT JOIN Tbl_Topup p ON p.Topup_ID = t.Topup_ID
WHERE ti.Transaction_Date >= convert(Date,'2012-09-1', 105)
AND ti.Transaction_Date < convert(Date,'2012-10-01', 105)
GROUP BY ti.Transaction_AccNo, ti.TransType_ID, p.Topup_Company
) d
GROUP BY d.Transaction_AccNo
) t
ON t.Transaction_AccNo = a.AccNo
OUTER APPLY ( -- SUM of all the amounts prior to date range
SELECT
Open_Balance = SUM(ti.Amount)
FROM Tbl_Transaction ti
WHERE ti.Transaction_AccNo = a.AccNo -- outer ref
AND ti.Transaction_Date < convert(Date,'2012-09-1', 105)
) Option3
ORDER BY a.AccNo
This work perfectly like the CTE, well done, but, how to edit sql query only show AccNo <> 1 ??
SELECT
a.AccNo,
isnull(t.Total_Adjustment,0.00),
t.Total_Topup,
t.Total_Comm,
t.Total_Transfer,
t.Total_RecvTransfer,
t.Total_Maxis,
t.Total_Digi,
t.Total_Celcom,
Option3.Open_Balance,
Option3.Open_Balance + t.TransactionsForPeriod AS ClosingBalance
FROM Tbl_Account a WHERE A.AccNo <> 1 <---- add at here??? ERROR ...
LEFT JOIN (
SELECT
d.Transaction_AccNo,
SUM(d.Amount) AS TransactionsForPeriod,
SUM( case when d.TransType_ID = 0 then d.Amount else 0 end ) as Total_Adjustment,
SUM( case when d.TransType_ID = 1 then d.Amount else 0 end ) as Total_Topup,
SUM( case when d.TransType_ID = 2 then d.Amount else 0 end ) as Total_Comm,
SUM( case when d.TransType_ID = 3 then d.Amount else 0 end ) as Total_Transfer,
SUM( case when d.TransType_ID = 4 then d.Amount else 0 end ) as Total_RecvTransfer,
SUM( case when d.TransType_ID = 2 AND d.Topup_Company = 'M' then d.Amount else 0 end ) as Total_Maxis,
SUM( case when d.TransType_ID = 2 AND d.Topup_Company = 'D' then d.Amount else 0 end ) as Total_Digi,
SUM( case when d.TransType_ID = 2 AND d.Topup_Company = 'C' then d.Amount else 0 end ) as Total_Celcom
FROM (
SELECT
ti.Transaction_AccNo,
ti.TransType_ID,
p.Topup_Company,
Amount = SUM(ti.Amount)
FROM Tbl_Transaction ti
LEFT JOIN Tbl_Topup p ON p.Topup_ID = ti.Topup_ID
where convert(Date,ti.Transaction_Date, 105) BETWEEN convert(Date,'16-09-2012', 105) AND convert(Date,'30-09-2012', 105)
GROUP BY ti.Transaction_AccNo, ti.TransType_ID, p.Topup_Company
) d
GROUP BY d.Transaction_AccNo
) t
ON t.Transaction_AccNo = a.AccNo
OUTER APPLY ( -- SUM of all the amounts prior to date range
SELECT
Top 1 Before_Amount as Open_Balance
FROM Tbl_Transaction ti
WHERE ti.Transaction_AccNo = a.AccNo -- outer ref
AND convert(Date,ti.Transaction_Date, 105) BETWEEN convert(Date,'16-09-2012', 105) AND convert(Date,'30-09-2012', 105)
ORDER BY Transaction_Date
) Option3
ORDER BY a.AccNo
Viewing 15 posts - 1 through 15 (of 26 total)
You must be logged in to reply to this topic. Login to reply