JOIN结果提供重复的行 - SQL Server

时间:2017-11-07 11:25:48

标签: sql sql-server join

我目前正在处理的数据库没有像我认为的那样设置。几乎没有任何主键/外键,因此连接表可能非常棘手。

我试图重新创建一个类似的问题,我加入的那个,我创建的结果是错误的重复行,这是由于缺少键。

sql fiddle - http://sqlfiddle.com/#!9/ff59ad/1

查询:

SELECT I.InvoiceNumber, I.AmountPaid,
O.Amount
FROM OrderInvoice O
JOIN Invoice I 
ON O.InvoiceNumber = I.InvoiceNumber

现在您可以看到发票编号

的重复订阅
InvoiceNumber   AmountPaid  Amount
    123           10          8
    123           10          2
    567           10          4
    567           10          6

每个支付的总金额应该是10,而由于匹配的行,连接每个创建20个。因此,如果我将这些结果分组并将它们相加,则总量是错误的。它与我的现实生活中的示例略有不同,因为看起来我实际上是因为重复的行而使用普通的连接语法进行交叉连接。

删除这些重复行的最佳方法是什么?我尝试连接多个列来创建一个唯一的行,但我没有其他列可以加入。

有人可以给我建议吗?

6 个答案:

答案 0 :(得分:3)

只需添加group by子句和sum聚合函数

SELECT I.InvoiceNumber, I.AmountPaid,
sum(O.Amount) Amount
FROM OrderInvoice O
JOIN Invoice I 
ON O.InvoiceNumber = I.InvoiceNumber group by I.InvoiceNumber, I.AmountPaid

结果:

InvoiceNumber   AmountPaid  Amount
123             10          10
567             10          10

答案 1 :(得分:0)

试试这个:

SELECT DISTINCT I.InvoiceNumber, I.AmountPaid
FROM OrderInvoice O
JOIN Invoice I 
ON O.InvoiceNumber = I.InvoiceNumber

第二个表格中每个InvoiceNumber有一条以上的记录 - 这就是为什么你在最后一组中获得多条记录的原因。

答案 2 :(得分:0)

当您加入table atable b时,每次比赛的结果都会有一行。

如果table b有两行匹配table a,那么表a中的数据将被复制。第一场比赛一次,第二场比赛一次。

在您的情况下,OrderInvoice表中有两行与Invoice表中的一行匹配。 AmountPaid来自Invoice表,因此Invoice中的单行与OrderInvoice中的两行匹配时会重复{。}}。

答案 3 :(得分:0)

如果支付的金额在所有行中都是静态的,那么您也需要将其分组,而不是按其分配。

SELECT I.InvoiceNumber, I.AmountPaid, SUM(O.Amount)
FROM OrderInvoice O
JOIN Invoice I ON O.InvoiceNumber = I.InvoiceNumber
GROUP BY I.InvoiceNumber, I.AmountPaid

答案 4 :(得分:0)

可以这样,'因为你有不同的金额值

如果您SUM金额应该没问题

SELECT I.InvoiceNumber, I.AmountPaid,
SUM(O.Amount)
FROM OrderInvoice O
JOIN Invoice I 
ON O.InvoiceNumber = I.InvoiceNumber
GROUP BY I.InvoiceNumber,I.AmountPaid

答案 5 :(得分:0)

我想也许你在此之后:

SELECT 
I.InvoiceNumber, 
I.AmountPaid,
L.LineTotal
FROM Invoice O
JOIN 
(
SELECT O.InvoiceNumber, SUM(O.Amount) As LineTotal
FROM OrderInvoice O
GROUP BY O.InvoiceNumber
) As L
ON L.InvoiceNumber = I.InvoiceNumber

这会将每个发票编号的行预先汇总为一行,然后将其连接到标题。

这为您提供了标题级别数字。

如果你想要一个行级数字,你需要弄清楚如何处理总数   - 把它放在第一线?   - 把它放在最后一行?   - 把它分成线?

这些都没有任何意义,但