左连接后 table 中的重复记录
Duplicate records in table after left join
我有三个table。
“部门”table: department_name, department_id.
Table "LowPrice": departmend_id, product_name, 购买, 出售, 价格。
Table“基本”:departmend_id、product_name、购买、出售、价格。
在table的“基本”和“低”中,一个部门可以有多个记录。
这些table之间没有关系。我想开发一个查询,根据部门 table 中的部门编号对 Low 和 Basic table 中的记录进行分组。分组时,每个部门的“基本”和“低价”table销售和采购商品的成本相加。
我的查询代码:
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;
但现在只有那些只有一个 table 中有记录的部门才被正确统计。如果两个 table 中有一个部门的记录,则它们的数量将相乘,查询将给出不正确的结果。
请告诉我我的查询需要更改什么。
考虑将 LowPrice
和 BasicPrice
合并为一个 table,因为它们在质量上包含相同的信息。只需添加一个类型字段来指定低价和基本价格记录。
Make-Table查询(待运行一次)
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
一旦您正确规范化了这两个关系以提高存储效率,运行 条件聚合。下面使用 table 别名和 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;
我有三个table。
“部门”table: department_name, department_id.
Table "LowPrice": departmend_id, product_name, 购买, 出售, 价格。
Table“基本”:departmend_id、product_name、购买、出售、价格。
在table的“基本”和“低”中,一个部门可以有多个记录。
这些table之间没有关系。我想开发一个查询,根据部门 table 中的部门编号对 Low 和 Basic table 中的记录进行分组。分组时,每个部门的“基本”和“低价”table销售和采购商品的成本相加。
我的查询代码:
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;
但现在只有那些只有一个 table 中有记录的部门才被正确统计。如果两个 table 中有一个部门的记录,则它们的数量将相乘,查询将给出不正确的结果。
请告诉我我的查询需要更改什么。
考虑将 LowPrice
和 BasicPrice
合并为一个 table,因为它们在质量上包含相同的信息。只需添加一个类型字段来指定低价和基本价格记录。
Make-Table查询(待运行一次)
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
一旦您正确规范化了这两个关系以提高存储效率,运行 条件聚合。下面使用 table 别名和 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;