我目前正在处理的数据库没有像我认为的那样设置。几乎没有任何主键/外键,因此连接表可能非常棘手。
我试图重新创建一个类似的问题,我加入的那个,我创建的结果是错误的重复行,这是由于缺少键。
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个。因此,如果我将这些结果分组并将它们相加,则总量是错误的。它与我的现实生活中的示例略有不同,因为看起来我实际上是因为重复的行而使用普通的连接语法进行交叉连接。
删除这些重复行的最佳方法是什么?我尝试连接多个列来创建一个唯一的行,但我没有其他列可以加入。
有人可以给我建议吗?
答案 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 a
到table 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
这会将每个发票编号的行预先汇总为一行,然后将其连接到标题。
这为您提供了标题级别数字。
如果你想要一个行级数字,你需要弄清楚如何处理总数 - 把它放在第一线? - 把它放在最后一行? - 把它分成线?
这些都没有任何意义,但