Faraz Ahmed
Faraz Ahmed

Reputation: 224

Write Query to get data with minimum query cost

These are my some tables with data

1) Transaction Table

AccountID       Debit      Credit
1-1-1-1-1-1-1   15500       0
1-1-1-1-2-1-1   25000       0
1-1-1-1-2-1-2   15000       0
1-1-1-1-2-1-3   0           44980
1-1-1-1-1-1-1   0           26500
1-1-1-1-2-1-1   0           6480
1-1-1-1-2-1-2   0           5000
1-1-1-1-2-1-3   30000       0
1-1-1-1-2-1-2   8800        0
1-1-1-1-2-1-1   0           3900

2) Budget Table

Month   AccountID      Budget
Jan     1-1-1-1-1-1-1   4000
Feb     1-1-1-1-1-1-1   4000
March   1-1-1-1-1-1-1   4000
Jan     1-1-1-1-2-1-1   7700
Feb     1-1-1-1-2-1-1   5400
March   1-1-1-1-2-1-1   6900
Jan     1-1-1-1-2-1-2   2500
Feb     1-1-1-1-2-1-2   5200
March   1-1-1-1-2-1-2   9800

3) Chart Of Account Table

AccountID       Title
1-1-1-1-1-1-1   NEW BULDING ADD.
1-1-1-1-2-1-1   AIR CONDITION 
1-1-1-1-2-1-2   BED SHEETS
1-1-1-1-2-1-3   BLACK & SOFT BOARD

and I want to get my result like this..

    AccID           Title             Budget Amount        Transaction Amount  
                            **Sum Group By Account ID | Sum(Debit) - Sum(Credit)**
    1-1-1-1-1-1-1   NEW BULDING ADD.    12000               11000       
    1-1-1-1-2-1-1   AIR CONDITION       20000               14620       
    1-1-1-1-2-1-2   BED SHEETS          17500               18800   

Please give me a query which return my expected result with minimum query cost.

Thanks In Advance....

Upvotes: 0

Views: 89

Answers (3)

Justin
Justin

Reputation: 9724

Query

SQLFiddleExmple

 SELECT A.AccountID
      , A.Title             
      , isnull(B.Budget,0) AS BudgetAmount
      , isnull(T.TransactionAmount, 0) AS TransactionAmount
FROM Account A cross apply
(SELECT SUM(Budget) AS Budget
FROM BudgetTable 
WHERE BudgetTable.AccountID = A.AccountID) B
cross apply
(SELECT SUM(Debit) - SUM(Credit)  AS TransactionAmount
FROM TransactionTable 
WHERE TransactionTable.AccountID = A.AccountID) T

Result:

|     ACCOUNTID |              TITLE | BUDGETAMOUNT | TRANSACTIONAMOUNT |
|---------------|--------------------|--------------|-------------------|
| 1-1-1-1-1-1-1 |   NEW BULDING ADD. |        12000 |            -11000 |
| 1-1-1-1-2-1-1 |      AIR CONDITION |        20000 |             14620 |
| 1-1-1-1-2-1-2 |         BED SHEETS |        17500 |             18800 |
| 1-1-1-1-2-1-3 | BLACK & SOFT BOARD |            0 |            -14980 |

Upvotes: 0

M.Ali
M.Ali

Reputation: 69554

 SELECT A.AccountID
      , A.Title             
      , B.Budget AS BudgetAmount
      , T.TransactionAmount  
FROM Account A INNER JOIN  
(SELECT AccountID, SUM(Budget) AS Budget
 FROM BudgetTable
 GROUP BY AccountID) B
ON A.AccountID = B.AccountID
INNER JOIN 
(SELECT AccountID, SUM(Debit) - SUM(Credit)  AS TransactionAmount
 FROM TransactionTable 
 GROUP BY AccountID) T
ON A.AccountID = T.AccountID

Sqlfiddle

Upvotes: 1

KumarHarsh
KumarHarsh

Reputation: 5094

Declare @Transaction  table (AccountID varchar(50),Debit float,Credit float)
insert into @Transaction
select '1-1-1-1-1-1-1',15500,0 union all
select '1-1-1-1-2-1-1',   25000,       0 union all
select '1-1-1-1-2-1-2',15000,       0 union all
select '1-1-1-1-2-1-3',0,44980 union all
select '1-1-1-1-1-1-1',  0,           26500 union all
select '1-1-1-1-2-1-1',   0,           6480 union all
select '1-1-1-1-2-1-2',   0 ,          5000 union all
select '1-1-1-1-2-1-3',   30000 ,      0 union all
select '1-1-1-1-2-1-2',   8800,        0 union all
select '1-1-1-1-2-1-1',   0 ,          3900

Declare @Budget   table (Months varchar(10),AccountID varchar(50),Budget float)
insert into @Budget
select 'Jan','1-1-1-1-1-1-1',4000 union all
select 'Feb','1-1-1-1-1-1-1',4000 union all
select 'March','1-1-1-1-1-1-1',4000 union all
select 'Jan','1-1-1-1-2-1-1',7700 union all
select 'Feb','1-1-1-1-2-1-1',5400 union all
select 'March','1-1-1-1-2-1-1',6900 union all
select 'Jan','1-1-1-1-2-1-2',2500 union all
select 'Feb','1-1-1-1-2-1-2',5200 union all
select 'March','1-1-1-1-2-1-2',9800

;with CTE as
(
select AccountID,sum(Budget ) BudgetAmount from @Budget group by AccountID
)
,cte1 as
(
select AccountID,sum(debit )debit ,sum(Credit) Credit from @Transaction group by AccountID
)
select a.AccountID,c.Title,a.BudgetAmount,b.debit-b.Credit [Transaction Amount] 
from cte a inner join cte1 b on a.AccountID=b.AccountID
inner join @Chart c on a.AccountID=c.AccountID

Upvotes: 1

Related Questions