【问题标题】:SUM WITH Left Join group by clauseSUM WITH Left Join group by 子句
【发布时间】:2018-01-08 16:28:56
【问题描述】:

我有三个表,它们有一个公共列 Ch_id。 我想用别名(Allocation、Received、Withdrawl、Balance)对所有三个表中的列(总计)求和。

如何加入所有三个表并获得如下结果。

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

请高手帮忙。

【问题讨论】:

标签: sql sql-server left-join inner-join


【解决方案1】:

对此有两种方法。一种是使用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;

【讨论】:

    【解决方案2】:

    最后我设法用下面的查询做到了。

        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)
    

    【讨论】:

      猜你喜欢
      • 2021-01-30
      • 2010-12-13
      • 2015-04-26
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2013-09-28
      • 1970-01-01
      相关资源
      最近更新 更多