【发布时间】:2013-11-29 19:32:09
【问题描述】:
我有一个 SQL 查询,我正在对一些表 SQL Server 数据库执行。结果集如下所示:
Column1 | Column2 | Column3 | InvoiceNumber | InvoiceID
-------------------------------------------------------
1 1 1 1234 1
1 1 1 5678 2
我只想取回具有最小 InvoiceID 的行及其对应的 InvoiceNumber。
我在 SELECT 语句中应用min(InvoiceID)。在 GROUP BY 子句中,我按除 InvoiceNumber 和 InvoiceID 之外的每一列进行分组。我收到一个错误,因为 InvoiceNumber 不包含在 SELECT 语句的聚合函数中,也不存在于 GROUP BY 子句中。
如何构造查询,以便只取回具有最小 InvoiceID 和相应 InvoiceNumber 的行?
编辑
以下是一些附加信息:
结果集实际上将包含许多行。只是偶尔,多行的 Column1、Column2 和 Column3 的值相同,但 InvoiceNumber 和 InvoiceID 的值不同。因此,结果集的更好示例如下所示:
Column1 | Column2 | Column3 | InvoiceNumber | InvoiceID
-------------------------------------------------------
1 1 1 1234 1
1 1 1 5678 2
2 1 1 1287 3
2 1 2 1287 3
2 2 1 1287 3
3 1 1 5555 4
3 1 2 5555 4
所以当 Column1、Column2 和 Column3 相同时,我只想要具有最小 InvoiceID 的结果,以及具有最小 InvoiceID 的行的 InvoiceNumber 是什么。在这种情况下,我希望它看起来像这样:
Column1 | Column2 | Column3 | InvoiceNumber | InvoiceID
-------------------------------------------------------
1 1 1 1234 1
2 1 1 1287 3
2 1 2 1287 3
2 2 1 1287 3
3 1 1 5555 4
3 1 2 5555 4
仅删除了第二行,因为它的 InvoiceID 较小,并且是唯一与不同行的 Column1、Column2 和 Column3 具有相同值的行。
这是我的 SQL 查询当前的样子:
SELECT c.CollectionID
, p.Account
, d.TransactionID
, id.InvoiceNumber
, i.InvoiceID
FROM collection c
INNER JOIN documents d on c.GlobalCollectionID = d.GlobalCollectionID
LEFT JOIN payment p on c.GlobalCollectionID = p.GlobalCollectionID
AND d.TransactionID = p.TransactionID
LEFT JOIN invoice i on c.GlobalCollectionID = i.GlobalCollectionID
AND d.TransactionID = i.TransactionID
LEFT JOIN invoicedata id on i.InvoiceID = id.InvoiceID
WHERE c.ProcessDate = '2013-11-29'
AND c.Item = 11805123
AND c.CollectionID in ('1104', '1105', '1106')
ORDER BY c.CollectionID
, d.TransactionID
, i.InvoiceID
, p.Account
【问题讨论】:
标签: sql sql-server group-by