使用子查询的sum函数

时间:2012-11-01 09:24:24

标签: sql sql-server tsql

我有三张桌子:

客户

customer_id   first_name
1              kapil
2              rajesh

帐户

Customer_id     Account_id
1                   S1
2                   s2

收据

Recipt_id   customer_id   Account_id   Transaction_type   Amount
R1            1              s1         Deposit           40000
R2            2              s2         Deposit             300
R3            1              s1         withdrawal         2000

现在我将查询如下

select   
    c.customer_id,c.first_name,s.current_balance,s.account_id,
    (select sum(amount) 
    from receipt as r ,
        saving_account as s 
    where r.transaction_type='deposit'
        and r.account_no = s.account_id
    ) as debit,
    (select sum(amount) 
    from receipt as r ,
        saving_account as s
    where r.transaction_type='withdrawl'
        and r.account_no = s.account_id  
    )as credit 
from customer as c 
left outer join saving_account as s 
inner join receipt as r on r.customer_id = s.customer_id 
on s.customer_id = c.customer_id 
group by c.customer_id

但是它给了我一笔整行和借记的单一值 我不明白为什么会这样表现出来......

我想要的结果是:

customer_id customer_name account_id debit credit balance
1           kapil         s1         40000   2000  200
2           rajesh        s2         300     null  500

3 个答案:

答案 0 :(得分:5)

SELECT  customer_ID, first_name, Account_ID,
        Deposit, Withdrawal, 
        (Deposit - Withdrawal) balance
FROM 
(
    SELECT  a.customer_ID, 
            a.first_name,
            b.Account_ID,
            SUM (CASE WHEN c.transaction_type = 'Deposit' THEN c.Amount ELSE 0 END) Deposit,
            SUM (CASE WHEN c.transaction_type = 'withdrawal' THEN c.Amount ELSE 0 END) Withdrawal
    FROM    customer a
            INNER JOIN Account b
                ON a.customer_ID = b.customer_ID
            LEFT JOIN Receipt c
                ON b.customer_ID = c.customer_ID AND
                    b.account_ID = c.Account_ID
    GROUP BY a.customer_ID, a.first_name, b.Account_ID
) bb

答案 1 :(得分:3)

试试这个:

select
  c.customer_id, 
  c.first_name,
  a.account_id,
  sum(case 
        when r.transaction_type='deposit' then r.Amount 
        else 0 
      end) as Debit,
  sum(case 
        when r.transaction_type='withdrawal' then r.Amount 
        else 0 
      end) as Credit,

  sum(case 
        when r.transaction_type='deposit' then r.Amount 
        else 0 
      end)-
  sum(case 
        when r.transaction_type='withdrawal' then r.Amount 
        else 0 
      end) as balance
from customer c
join account a
  on c.customer_id = a.customer_id
join Receipt r
  on a.account_id = r.account_id
group by 
  c.customer_id, 
  c.first_name,
  a.account_id

您还可以test it online

注意:我不知道如何确定Balace,所以我只是按Debit - Credit计算出来。

答案 2 :(得分:1)

在saving_account表上推断current_balance列:

Select
  c.customer_id,
  c.customer_name,
  s.account_id,
  sum(case when r.transaction_type = 'Deposit' Then r.Amount Else 0 End) As debit,
  sum(case when r.transaction_type = 'Withdrawal' Then r.Amount Else 0 End) as credit,
  s.current_balance
From
  customer c
    left outer join
  saving_account s
    on c.customer_id = s.customer_id
    left outer join
  receipt r
    on s.customer_id = r.customer_id and s.account_id = r.account_id
Group By
  c.customer_id,
  c.customer_name,
  s.account_id,
  s.current_balance