【问题标题】:sql sum data from multiple tablessql汇总多个表中的数据
【发布时间】:2011-02-05 04:34:57
【问题描述】:

我有 2 个表 AP 和 INV,它们都有 [PROJECT] 和 [Value] 列。

我希望查询返回如下内容:

项目 | SUM_AP | SUM_INV

我想出了下面的代码,但它返回了错误的结果(总和是错误的)。

SELECT AP.[PROJECT],
SUM(AP.Value) AS SUM_AP, 
SUM(INV.Value) AS SUM_INV
FROM AP INNER JOIN INV ON (AP.[PROJECT] =INV.[PROJECT])
WHERE AP.[PROJECT] = 'XXXXX'
GROUP BY AP.[PROJECT]

【问题讨论】:

    标签: sql join ms-jet-ace


    【解决方案1】:

    您的查询结果是错误的,因为您尝试汇总的值正在分组,这会导致重复值包含在 SUM 中。

    您可以通过几个子选择来解决它:

    SELECT 
        AP1.[PROJECT],
        (SELECT SUM(AP2.Value) FROM AP AS AP2 WHERE AP2.PROJECT = AP1.PROJECT) AS SUM_AP,
        (SELECT SUM(INV2.Value) FROM INV AS INV2 WHERE INV2.PROJECT = AP1.PROJECT) AS SUM_INV
    FROM AP AS AP1 
        INNER JOIN INV AS INV1 
            ON (AP1.[PROJECT] =INV1.[PROJECT])
    WHERE AP1.[PROJECT] = 'XXXXX'
    GROUP BY AP1.[PROJECT]
    

    【讨论】:

    • 我得到“您尝试执行的查询不包括作为聚合函数的一部分的指定表达式 'Project'。”
    • 我更新了第二个子查询以避免另一个分组列。你能再试一次吗?
    【解决方案2】:

    如果 AP 中有 N 行具有给定项目 ID,而 INV 中有 M 行具有该 ID,则项目 ID 上的两个表之间的联接将总共有 N*M 行该项目,因为 AP 中的同一行将针对 INV 中具有该项目 ID 的每一行重复,反之亦然。因此,为什么您的计数很可能会关闭(因为由于连接重复,它会多次计算给定表中的同一行)。

    相反,您可能想尝试在两个子查询的结果之间进行连接,一个按项目 ID 对第一个表进行分组并求和,第二个按项目 ID 对另一个表进行分组并求和- 然后在每个项目 ID 只有 1 行的总和后加入。

    【讨论】:

      【解决方案3】:

      如果PROJECT是父表,你应该选择FROM项目表,并在两个子表上做一个左外连接:

      SELECT PROJECT.PROJECT_ID, SUM(AP.Value) AS SUM_AP, SUM(INV.Value) AS SUM_INV
      FROM PROJECT
      LEFT OUTER JOIN AP ON (AP.[PROJECT] = PROJECT.[PROJECT_ID])
      LEFT OUTER JOIN INV ON (INV.[PROJECT] = PROJECT.[PROJECT_ID])
      WHERE PROJECT.[PROJECT_ID] = 'XXXXX'
      GROUP BY PROJECT.[PROJECT_ID]
      

      【讨论】:

        【解决方案4】:

        您可以将两个总和计算分开。我能想到的一种方法是将库存计算移到子查询中,例如:

        SELECT 
            AP.[PROJECT]
        ,   SUM(AP.Value) AS SUM_AP
        ,   SummedInv as SUM_INV
        FROM AP
        LEFT JOIN (
            SELECT PROJECT, SUM(Value) AS SUM_INV
            FROM INV
            GROUP BY PROJECT
        ) SummedInv ON SummedInv.Project = AP.Project
        GROUP BY AP.PROJECT, SummedInv.SUM_INV
        

        因为SummedInv 子查询在project 上分组,所以在外部查询中也可以安全地在SummedInv.SUM_INV 上分组。

        【讨论】:

          【解决方案5】:

          这个查询怎么样:

          select SUM(gpCutBody.actualQty) as cutQty   , SUM(gpSewBody.quantity) as sewQty
          
          from jobOrder
          inner join gpCutHead on gpCutHead.joNum = jobOrder.joNum
          inner join gpSewHead on gpSewHead.joNum = jobOrder.joNum
          
          inner join gpCutBody on gpCutBody.gpCutID = gpCutHead.gpCutID
          inner join gpSewBody on gpSewBody.gpSewID = gpSewHead.gpSewID
          
          
          where jobOrder.joNum = '36'
          

          这里是 ERD 的链接:http://dl.dropbox.com/u/18794525/AUG%207%20DUMP%20STAN.png

          【讨论】:

          • 您是否从数据库中发布 ERD?我认为最好用 OP 提供的信息来回答
          【解决方案6】:

          试试:

          SELECT AP.[PROJECT] AS PROJECT, SUM(AP.[Value]) AS SUM_AP, SUM(INV.[Value]) AS SUM_INV
          FROM AP, INV
          WHERE AP.[PROJECT] = INV.[PROJECT]
          AND AP.[PROJECT] = 'XXXXX'
          GROUP BY AP.[PROJECT]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-12
            • 2015-07-18
            • 2023-04-11
            • 1970-01-01
            • 2015-08-18
            • 1970-01-01
            • 1970-01-01
            • 2022-01-01
            相关资源
            最近更新 更多