【问题标题】:SQL only returns sum for ids with multiple occurencesSQL 仅返回多次出现的 id 的总和
【发布时间】:2025-12-17 04:30:01
【问题描述】:

所以我有三个表(AcDD、AH、Life),每个客户有多个金额。客户可以有任何类型的组合。我为每个表创建了一个查询来汇总每个 AcDD、AH 和 Life 的数量。然后我创建了第四个查询,将所有这些查询组合在一起。问题是我只获得了所有 3 个查询共有的 ID……客户可能只有 Life,没有 AcDD 或 AH——我的第四个查询中缺少此 ID。我做错了什么?

按表查询(三张表都存在同一个查询):

SELECT DISTINCTROW [Customers-Personal].[Customer ID], 
       Sum([NewB-Coverage: AH].[AH Monthly Benefit]) AS [Sum Of AH Monthly Benefit]
FROM [Customers-Personal] INNER JOIN [NewB-Coverage: AH] 
ON [Customers-Personal].[Customer ID] = [NewB-Coverage: AH].[Customer ID]
GROUP BY [Customers-Personal].[Customer ID];

第四个查询(结合所有)

SELECT [Customers-Personal].[Customer ID], 
       Sum_AcDD.[Sum Of AcDD Amount], 
       Sum_AH.[Sum Of AH Monthly Benefit], 
       Sum_Life.[Sum Of Decr Life Amount], 
       Sum_Life.[Sum Of Level Life Amount]
FROM Sum_Life INNER JOIN 
              (Sum_AH INNER JOIN 
                      (Sum_AcDD INNER JOIN [Customers-Personal] 
                                ON Sum_AcDD.[Customer ID] = [Customers-Personal].[Customer ID]) 
                      ON Sum_AH.[Customer ID] = [Customers-Personal].[Customer ID]) 
              ON Sum_Life.[Customer ID] = [Customers-Personal].[Customer ID];

【问题讨论】:

    标签: sql ms-access select


    【解决方案1】:

    您需要使用左(或右)连接。 INNER JOINS 要求所有表中都存在匹配的记录。左连接指定应返回左表中的所有记录。对于右表中不匹配的行,返回空值。 (右连接的作用完全相同,只是交换表名的相对位置。通常的做法是始终对表进行排序,以便只使用左连接,但这不是必需的。)

    请参阅特定于 MS Access 的 LEFT JOIN, RIGHT JOIN Operations

    重做第 4 个查询。我懒惰地使用 RIGHT 连接只是为了保持表格的原始顺序:

    SELECT [Customers-Personal].[Customer ID], 
           Sum_AcDD.[Sum Of AcDD Amount], 
           Sum_AH.[Sum Of AH Monthly Benefit], 
           Sum_Life.[Sum Of Decr Life Amount], 
           Sum_Life.[Sum Of Level Life Amount]
    FROM Sum_Life RIGHT JOIN 
              (Sum_AH RIGHT JOIN 
                  (Sum_AcDD RIGHT JOIN [Customers-Personal] 
                            ON Sum_AcDD.[Customer ID] = [Customers-Personal].[Customer ID]) 
                  ON Sum_AH.[Customer ID] = [Customers-Personal].[Customer ID]) 
              ON Sum_Life.[Customer ID] = [Customers-Personal].[Customer ID];
    

    【讨论】:

    • @C Perkins,感谢您的帮助,详细的解释和链接,这非常有效!
    【解决方案2】:

    有多种方法可以解决这个问题。要记住的主要事情是您的联接类型。确保保留您的 [Customers-Personal].[Customer ID] 列和该表中的左连接。

    SELECT 
     [Customers-Personal].[Customer ID]
    ,Sum_AcDD.[Sum Of AcDD Amount]
    ,Sum_AH.[Sum Of AH Monthly Benefit]
    ,Sum_Life.[Sum Of Decr Life Amount]
    ,Sum_Life.[Sum Of Level Life Amount]
    FROM 
    [Customers-Personal] 
    LEFT JOIN Sum_AcDD ON [Customers-Personal].[Customer ID] = Sum_Life.[Customer ID]
    LEFT JOIN Sum_AH   ON [Customers-Personal].[Customer ID] = Sum_AH.[Customer ID]
    LEFT JOIN Sum_Life ON [Customers-Personal].[Customer ID] = Sum_Life.[Customer ID]
    

    【讨论】:

    • @Andrew,感谢您的回复,但这没有用。我收到一条错误消息:查询表达式 [Customers-Personal].[Customer ID] = Sum_Life.[Customer ID] LEFT JOIN Sum_AH ON [[Customers-Personal].[Customer ID] = Sum_AH. [客户 ID] LEFT JOIN Sum_Life ON [[Customers-Personal].[Customer ID] = Sum_Life.[Customer ID].....不确定这是否与将 Sum AcDD 设置为 Sum_Life 的 Left Join 有关。 [客户 ID]...不确定它是否与 LEFT JOIN Sum_AcDD ON [Customers-Personal] 有关。[客户 ID] = Sum_Life.[客户 ID] 但@C Perkins 解决方案有效。