【问题标题】:SQL Query to sum fields from different tablesSQL 查询对不同表中的字段求和
【发布时间】:2010-02-20 09:08:58
【问题描述】:

我是一个卑微的程序员,讨厌 SQL ... :) 请帮我解决这个问题。

我有 4 个表,例如:

Table A:
Id Total
1  100
2  200
3  500

Table B
ExtId  Amount
1      10
1      20
1      13
2      12
2      43
3      43
3      22

Table C
ExtId  Amount
1      10
1      20
1      13
2      12
2      43
3      43
3      22

Table D
ExtId  Amount
1      10
1      20
1      13
2      12
2      43
3      43
3      22

我需要像这样显示表 B、C 和 D 的 Amount 字段的 Id、Total 和 SUM 的 SELECT

Id Total AmountB AmountC AmountD
1  100   43      43      43
2  200   55      55      55
3  500   65      65      65

我尝试通过 Id 对三个表进行内部连接,并对金额字段进行求和,但结果不正确。这是错误的查询:

SELECT     dbo.A.Id, dbo.A.Total, SUM(dbo.B.Amount) AS Expr1, SUM(dbo.C.Amount) AS  Expr2, SUM(dbo.D.Amount) AS Expr3
FROM         dbo.A INNER JOIN
                  dbo.B ON dbo.A.Id = dbo.B.ExtId INNER JOIN
                  dbo.C ON dbo.A.Id = dbo.C.ExtId INNER JOIN
                  dbo.D ON dbo.A.Id = dbo.D.ExtId
GROUP BY dbo.A.Id, dbo.A.Total

提前谢谢,只是我讨厌 SQL(或者 SQL 讨厌我)。

编辑:我有一个错字。此查询没有给出正确的结果。扩展示例。

【问题讨论】:

    标签: sql select join sum


    【解决方案1】:

    或者您可以利用子查询:

    select A.ID, A.Total, b.SB as AmountB, c.SC as AmountC, d.SD as AmountD
    from A
      inner join (select ExtID, sum(Amount) as SB from B group by ExtID) b on A.ID = b.ExtID
      inner join (select ExtID, sum(Amount) as SC from C group by ExtID) c on c.ExtID = A.ID
      inner join (select ExtID, sum(Amount) as SD from D group by ExtID) d on d.ExtID = A.ID
    

    【讨论】:

    • 我真的很喜欢你的方法。干净,简单......而且它有效!谢谢..但我仍然喜欢 SQL :P
    【解决方案2】:

    根据您的描述,此查询应该会给您一个错误,因为您在 group by 中使用了不存在的列 dbo.A.Amount。将其更改为 dbo.A.Total 可能是您需要的。

    如果您需要将所有金额放在一起,请尝试以下查询:

    select A.Id, A.Total, sum(B.Amount + C.Amount + D.Amount) AS Total_Amount
    from A
      inner join B on A.Id = B.ExtId
      inner join C on A.Id = C.ExtId
      inner join D on A.Id = D.ExtId
    group by A.Id, A.Total;
    

    【讨论】:

    • 这是最好的答案,因为这个查询应该执行得更快,因为它可以被 SQL Server 优化,因为它不包含嵌套查询。
    【解决方案3】:

    这个也很好用

    SELECT (SELECT SUM(Amount) FROM TableA) AS AmountA, (SELECT SUM(Amount) FROM TableB) AS AmountB, (SELECT SUM(Amount) FROM TableC) AS AmountC, (SELECT SUM(Amount) FROM TableD) AS AmountD

    【讨论】:

      【解决方案4】:

      试试这个代码 SELECT Total=isnull((Select Sum(Isnull(Amount,0)) from table a),0)+isnull((Select Sum(isnull(Amount,0)) from table b),0)+isnull((Select Sum (isnull(Amount,0)) 来自表 c),0)

      【讨论】:

        【解决方案5】:

        这可能会对其他用户有所帮助。

        SELECT Total=(Select Sum(Amount) from table a)+(Select Sum(Amount) from table b)+(Select Sum(Amount) from table c)
        

        【讨论】:

          猜你喜欢
          • 2013-01-30
          • 2018-07-24
          • 1970-01-01
          • 1970-01-01
          • 2012-04-20
          • 1970-01-01
          • 2015-10-04
          • 1970-01-01
          • 2021-05-27
          相关资源
          最近更新 更多