1

我有 2 张桌子ProductsInvoices. 每个Products都可以在一些Invoices.

Product:

Id| Name
ـــــــــــــــ
1 | pencil
2 | pen
3 | ruler


Invoice:

Id| ProductID| Serial |Qty
ـــــــــــــــــــــــــــــ
1 | 1        |100     |5
2 | 1        |200     |6
3 | 2        |300     |8
4 | 3        |400     |18

当我编写以下查询时

select * , SUM(Invoices.Qty)

FROM Products left outer join Invoices on Products.Id = Invoices.ProductID

Group by Products.Id

结果:

Id| Name  |Id|ProductID| Serial|SUM(Invoices.Qty)
ـــــــــــــــــــــــــــــــــــــــــــــــــــــ
1 |pencil |2 |1        |200    |11 -> (5+6)
2 |pen    |3 |2        |300    |8
3 |ruler  |4 |3        |400    |18

它返回最后一张 Invoice加入的所有产品的列表。它计算Qty正确,但问题是最后一张发票的选择。如何编写一个Qty正确计算并返回我想要Invoices的查询。id

在此示例中,我希望发票 ID 为 1(序列号 100)而不是 2(序列号 200)

4

2 回答 2

0

在 SQLite 3.7.11 或更高版本中,您可以使用MINMAX函数强制返回组中的特定对象:

SELECT *, MIN(Invoices.Serial), SUM(Invoices.Qty)
FROM Products LEFT JOIN Invoices ON Products.Id = Invoices.ProductID
GROUP BY Products.Id
于 2013-09-03T13:00:27.353 回答
0

尝试这个:

SELECT *,
(select sum(i3.qty) from Invoices i3 where i3.productId = i.productId)
FROM invoices I
JOIN products P
     on I.productId = P.id
WHERE NOT EXISTS(
    SELECT 'PREVIOUS'
    FROM invoices I2
    where I2.ProductId = I.productId
    and I2.id < I.id
)

通过这种方式,您可以获得有关产品的第一张发票。我不明白您是否不存在要展示产品的发票。如果是,您必须使用左外连接更改查询

于 2013-09-03T12:36:24.337 回答