[英]SUM WITH Left Join group by clause
我有三個表,它們的公共列為Ch_id。 我想用別名(分配,已接收,取款,余額)對所有三個表中的列(總計)求和。
如何連接所有三個表並獲得如下結果。
CH_id Allocation Received Withdrawl Balance(Received-Withdrawl)
--------------------------------------------------------------------------
1 100000 50000 25000 25000
2 300000 20000 200000 0
3 200000 100000 0 100000
...... and so on
我想要CH_Allocation表中的所有行
我已經嘗試了以下方法,但是它並沒有達到預期的效果。
SELECT
CH_Allocation.CH_id,
SUM(CH_Allocation.Total) AS Allocated,
SUM(ch_funds.Total) AS received,
(req_ch.total) AS Withdrawl
FROM CH_Allocation
LEFT JOIN Req_CH
ON Req_CH.CH_id = CH_Allocation.CH_id
LEFT JOIN CH_Funds
ON CH_Funds.CH_id = CH_Allocation.CH_id
WHERE
CH_Allocation.Project_Id = 2 AND
Req_CH.Project_id = 2
GROUP BY
CH_Allocation.CH_id,
Req_CH.ch_id,
CH_Funds.CH_id
還有這個
select a.ch_id,SUM(a.total) as alloted,SUM(b.total) as received,SUM(c.total) as withdrawl,SUM(b.Total)-sum(c.Total) as balance from
CH_Allocation a,CH_Funds b,Req_CH c
where a.CH_id=b.CH_id
and c.CH_id=b.CH_id
and b.CH_id=a.CH_id
and c.Project_id=2
and a.Project_Id=2
and b.Project_Id=2
group by a.CH_id
請高手幫忙。
有兩種方法。 一種是使用full join
,但這很麻煩,因為會創建許多NULL
值。 第二種是將表合並在一起,然后聚合:
SELECT CH_id,
SUM(Allocated) AS Allocated,
SUM(received) AS received,
SUM(Withdrawal) AS Withdrawal
FROM ((SELECT Project_Id, ch_id, Total as allocated, 0 as received, 0 as Withdrawal
FROM CH_Allocation
) UNION ALL
(SELECT Project_Id, ch_id, 0 as allocated, Total as received, 0 as Withdrawal
FROM Req_CH
) UNION ALL
(SELECT Project_Id, ch_id, 0 as allocated, 0 as received, Total as Withdrawal
FROM CH_Funds
)
) t
WHERE Project_Id = 2
GROUP BY ch_id;
最后,我設法通過下面的查詢來做到這一點。
SELECT a.CH_id AS CH_ID,isnull(t.allocated,0) AS allocated,
isnull(s.received,0) AS received,isnull(p.withdrawl,0) AS withdrawl,
isnull(received,0)-isnull(withdrawl,0) AS Balance
FROM CH_Allocation a
LEFT JOIN (SELECT ch_id, sum(total) AS allocated FROM CH_Allocation
where Project_Id=1 GROUP BY ch_id ) t
ON (a.id = t.ch_id)
LEFT JOIN ( SELECT ch_id, sum(total) AS received
FROM CH_Funds where Project_Id=1 GROUP BY ch_id) s ON (a.id = s.ch_id)
LEFT JOIN ( SELECT ch_id, sum(Total) AS withdrawl
FROM Req_CH where Project_Id=1 GROUP BY ch_id) p ON (a.id = p.ch_id)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.