【问题标题】:Duplicate records in table after left join左连接后表中的重复记录
【发布时间】:2021-12-25 09:57:13
【问题描述】:

我有三张桌子。

“部门”表:department_name、department_id。

表“LowPrice”:departmend_id、product_name、购买、出售、价格。

表“基本”:departmend_id、product_name、购买、出售、价格。

在“基本”和“低”表中,可以有几条属于一个部门的记录。

这些表之间没有关系。我想开发一个查询,该查询将按 Departments 表中的部门编号对 Low 和 Basic 表中的记录进行分组。分组时,将每个部门的“基本”和“低价”表中销售和购买商品的成本相加。

我的查询代码:

    SELECT Departments.departmend_id, 
    Sum([Basic]![purchased] [Basic]![price]) AS PurchasedBasic 
    Sum([Basic]![sold] [Basic]![price]) AS SoldBasic, 
    Sum([Basic]![purchased] [Basic]![price]) - Sum([Basic]![sold][Basic]![price]) AS DiffBasic, 
    Sum([LowPrice]![purchased] [LowPrice]![price]) AS PurchasedLowPrice, 
    Sum([LowPrice]![sold] [LowPrice]![price]) AS SoldLowPrice, 
    Sum([LowPrice]![purchased] [LowPrice]![price]) - Sum([LowPrice]![sold] [LowPrice]![price]) AS DiffLowPrice
    FROM (Departments LEFT JOIN Basic ON Departments.departmend_id = Basic.departmend_id) LEFT JOIN LowPrice ON Departments.departmend_id = LowPrice.departmend_id
    GROUPBY Departments.departmend_id;

但是现在只有那些只有一张表有记录的部门才算正确。如果两个表中有一个部门的记录,那么它们的数量会相乘,并且查询会给出错误的结果。

请告诉我我需要在查询中更改什么。

【问题讨论】:

  • 能否请您添加源数据样本,以及您获得的结果与您的预期?你的 dbms 是什么?
  • @Christophe 我添加了示例数据和预期结果。我使用 MS Access
  • 好的,所以我提出的答案不适合这个工具,我将无法提供帮助:-/
  • LowPriceBasic 创建一个子查询。将这些按department_id 分组以重新加入部门。

标签: sql ms-access


【解决方案1】:

考虑将LowPriceBasicPrice 合并到一个表中,因为它们在质量上包含相同的信息。只需添加一个 Type 字段来指定低价和基本价格记录。

生成表查询 (运行一次)

SELECT p.*
INTO Prices
FROM
   (SELECT b.department_id,
           b.product_name,
           b.purchased,
           b.sold, 
           b.price,
           'Basic Price' AS type
    FROM BasicPrice b

    UNION ALL

    SELECT l.department_id,
           l.product_name,
           l.purchased,
           l.sold, 
           l.price,
           'Low Price' AS type
    FROM LowPrice l
   ) p

一旦您正确规范了这两个关系以获得更有效的存储,请运行条件聚合。下面使用 MS Access 支持的表别名和计算列。

条件聚合查询

SELECT d.departmend_id, 
       d.department_name,
       SUM(IIF(p.Type = 'Basic Price', p.[purchased] * p.[price], NULL)) AS PurchasedBasic,
       SUM(IIF(p.Type = 'Basic Price', p.[sold] * p.[price], NULL)) AS SoldBasic, 
       [PurchasedBasic] - [SoldBasic] AS DiffBasic, 

       SUM(IIF(p.Type = 'Low Price', p.[purchased] * p.[price], NULL)) AS PurchasedLowPrice, 
       SUM(IIF(p.Type = 'Low Price', p.[sold] * p.[price], NULL)) AS SoldLowPrice, 
       [PurchasedLowPrice] - [SoldLowPrice] AS DiffLowPrice

FROM Departments d
LEFT JOIN Prices p ON d.departmend_id = p.departmend_id

GROUP BY d.departmend_id,
         d.department_name;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-08
    • 2023-04-10
    • 2016-07-25
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2021-01-11
    • 2017-03-01
    相关资源
    最近更新 更多