如何通过连接 sql 中的两个表来删除 select 语句中的重复项
how to remove duplicate in select statement with joining of two tables in sql
美好的一天,我正在处理这个查询,我想从两个不同的行中删除重复数据,例如,我从这里得到这个记录查询结果:
SELECT DISTINCT
T9.SlpName, T1.CardName [Customer Name],T1.DocNum [SO No.],
T1.DocDate [SO Date],T1.DocTotal [SO Total], T3.DocNum [Delivery Doc Num],
T5.DocNum [TRA No], T5.DocDate [TRA Date],T5.DocTotal [TRA Total],
T5.GrosProfit [Gross Profit]
FROM RDR1 T0 INNER JOIN ORDR T1 ON T0.DocEntry = T1.DocEntry
left outer join DLN1 T2 on T2.BaseEntry = T0.DocEntry
left outer join ODLN T3 on T2.DocEntry = T3.DocEntry
left Outer join INV1 T4 on T4.BaseEntry = T3.DocEntry and T4.BaseLine = T2.Linenum and T4.BaseType = 15
OR (T4.Basetype=17 and T4.BaseEntry=T0.DocEntry and T4.BaseLine=T0.LineNum)
left outer join OINV T5 on T5.DocEntry = T4.DocEntry
left outer join OSLP T9 on T9.SlpCode = T1.SlpCode
WHERE T1.DocDate BETWEEN '10.01.16' AND '10.27.16' AND T1.CardCode='C-ACQUA TECH'
Group by T9.SlpName, T1.[CardName], T1.[DocNum], T1.[DocDate], T1.DocTotal,
T3.DocNum, T5.DocNum, T5.DocDate, T5.DocTotal,T5.GrosProfit
ORDER BY T9.SlpName,T1.CardName
Customer | SO-Date | SO-Number | SO-Amount | INV-Date | INV-Amount
B1 10-07-16 000001 80,000.50 11-26 54,000.00
B1 10-07-16 000001 80,000.50 11-29 24,000.00
SO 是在同一天发布的,但发票日期不同,所以当我做 crystal 报告时..SO 金额已加总,即使它只是重复了。我想要的(因为我无法在 crystal 报告中找到对重复值求和的方法)是:
Customer | SO-Date | SO-Number | SO-Amount | INV-Date | INV-Amount
B1 10-07-16 000001 80,000.50 11-26-16 54,000.00
null null null null 11-29-16 24,000.00
如果某行在连接的另一端有多个连接伙伴,您将始终复制该行。您将需要两个单独的查询来汇总 SO-Amount
和 INV-Amount
.
--- 编辑 ---
考虑这个简单的例子:我们有三个 table。一种保存公司部门,一种存储部门的年收入,一种存储这些部门每月的成本。
Table 1
DepartmentId | DepartmentName | NumberEmployees
5234 | "Software Development" | 20
3465 | "Sales" | 120
Table 2
DepartmentId | Year | Revenue
5234 | 2015 | 2,000,000
5234 | 2014 | 1,500,000
Table 3
DepartmentId | Year | Month | Cost
5234 | 2015 | Jan | 120,000
5234 | 2015 | Feb | 150,000
5234 | 2014 | Jan | 80,000
现在的任务是汇总部门 5234
的总收入以及总成本。
如果我们加入 table 1 和 table 2,我们得到:
DepartmentId | DepartmentName | NumberEmployees| Year | Revenue
5234 | "Software Development" | 20 | 2015 | 2,000,000
5234 | "Software Development" | 20 | 2014 | 1,500,000
有了这个 table 我们可以计算出总收入。
如果我们加入 table 1 和 3,我们得到:
DepartmentId | DepartmentName | NumberEmployees | Year | Month | Cost
5234 | "Software Development" | 20 | 2015 | Jan | 120,000
5234 | "Software Development" | 20 | 2015 | Feb | 150,000
5234 | "Software Development" | 20 | 2014 | Jan | 80,000
有了这个table你就可以计算出总成本了。
虽然您不想做的是加入所有 3 个 table,因为那样您会得到:
DepartmentId | DepartmentName | NumberEmployees| Year | Revenue | Month | Cost
5234 | "Software Development" | 20 | 2015 | 2,000,000 | Jan | 120,000
5234 | "Software Development" | 20 | 2015 | 2,000,000 | Feb | 150,000
5234 | "Software Development" | 20 | 2014 | 1,500,000 | Jan | 80,000
如您所见,2015 年的收入是重复的,因为 2015 年(1 月和 2 月)的成本条目太多。如果您使用此 table 计算总收入和成本,您最终会得到错误的值。
总结一下并解决你的问题:你应该使用两个单独的查询来计算你的聚合。
美好的一天,我正在处理这个查询,我想从两个不同的行中删除重复数据,例如,我从这里得到这个记录查询结果:
SELECT DISTINCT
T9.SlpName, T1.CardName [Customer Name],T1.DocNum [SO No.],
T1.DocDate [SO Date],T1.DocTotal [SO Total], T3.DocNum [Delivery Doc Num],
T5.DocNum [TRA No], T5.DocDate [TRA Date],T5.DocTotal [TRA Total],
T5.GrosProfit [Gross Profit]
FROM RDR1 T0 INNER JOIN ORDR T1 ON T0.DocEntry = T1.DocEntry
left outer join DLN1 T2 on T2.BaseEntry = T0.DocEntry
left outer join ODLN T3 on T2.DocEntry = T3.DocEntry
left Outer join INV1 T4 on T4.BaseEntry = T3.DocEntry and T4.BaseLine = T2.Linenum and T4.BaseType = 15
OR (T4.Basetype=17 and T4.BaseEntry=T0.DocEntry and T4.BaseLine=T0.LineNum)
left outer join OINV T5 on T5.DocEntry = T4.DocEntry
left outer join OSLP T9 on T9.SlpCode = T1.SlpCode
WHERE T1.DocDate BETWEEN '10.01.16' AND '10.27.16' AND T1.CardCode='C-ACQUA TECH'
Group by T9.SlpName, T1.[CardName], T1.[DocNum], T1.[DocDate], T1.DocTotal,
T3.DocNum, T5.DocNum, T5.DocDate, T5.DocTotal,T5.GrosProfit
ORDER BY T9.SlpName,T1.CardName
Customer | SO-Date | SO-Number | SO-Amount | INV-Date | INV-Amount
B1 10-07-16 000001 80,000.50 11-26 54,000.00
B1 10-07-16 000001 80,000.50 11-29 24,000.00
SO 是在同一天发布的,但发票日期不同,所以当我做 crystal 报告时..SO 金额已加总,即使它只是重复了。我想要的(因为我无法在 crystal 报告中找到对重复值求和的方法)是:
Customer | SO-Date | SO-Number | SO-Amount | INV-Date | INV-Amount
B1 10-07-16 000001 80,000.50 11-26-16 54,000.00
null null null null 11-29-16 24,000.00
如果某行在连接的另一端有多个连接伙伴,您将始终复制该行。您将需要两个单独的查询来汇总 SO-Amount
和 INV-Amount
.
--- 编辑 ---
考虑这个简单的例子:我们有三个 table。一种保存公司部门,一种存储部门的年收入,一种存储这些部门每月的成本。
Table 1
DepartmentId | DepartmentName | NumberEmployees
5234 | "Software Development" | 20
3465 | "Sales" | 120
Table 2
DepartmentId | Year | Revenue
5234 | 2015 | 2,000,000
5234 | 2014 | 1,500,000
Table 3
DepartmentId | Year | Month | Cost
5234 | 2015 | Jan | 120,000
5234 | 2015 | Feb | 150,000
5234 | 2014 | Jan | 80,000
现在的任务是汇总部门 5234
的总收入以及总成本。
如果我们加入 table 1 和 table 2,我们得到:
DepartmentId | DepartmentName | NumberEmployees| Year | Revenue
5234 | "Software Development" | 20 | 2015 | 2,000,000
5234 | "Software Development" | 20 | 2014 | 1,500,000
有了这个 table 我们可以计算出总收入。
如果我们加入 table 1 和 3,我们得到:
DepartmentId | DepartmentName | NumberEmployees | Year | Month | Cost
5234 | "Software Development" | 20 | 2015 | Jan | 120,000
5234 | "Software Development" | 20 | 2015 | Feb | 150,000
5234 | "Software Development" | 20 | 2014 | Jan | 80,000
有了这个table你就可以计算出总成本了。
虽然您不想做的是加入所有 3 个 table,因为那样您会得到:
DepartmentId | DepartmentName | NumberEmployees| Year | Revenue | Month | Cost
5234 | "Software Development" | 20 | 2015 | 2,000,000 | Jan | 120,000
5234 | "Software Development" | 20 | 2015 | 2,000,000 | Feb | 150,000
5234 | "Software Development" | 20 | 2014 | 1,500,000 | Jan | 80,000
如您所见,2015 年的收入是重复的,因为 2015 年(1 月和 2 月)的成本条目太多。如果您使用此 table 计算总收入和成本,您最终会得到错误的值。
总结一下并解决你的问题:你应该使用两个单独的查询来计算你的聚合。