2016-10-26 131 views
0

我有以下查询GROUP BY与SUM和最新日期

SELECT 
TableA.MaterialCode, 
TableB.LotNumber, 
SUM(TableB.Quantity) AS Quantity, 
CONVERT(varchar(25), TableC.IssueDate, 121) AS IssueDate 
FROM TableA 
INNER JOIN 
TableB ON TableA.PONumber = TableB.PONumber 
INNER JOIN 
TableC ON TableA.PONumber = TableC.PONumber 
WHERE TableC.VendorID = 'VendorID' 
AND TableC.IssueDate > '10/25/2016 9:47:53 AM' 
GROUP BY MaterialCode, LotNumber, IssueDate 
ORDER BY TableC.IssueDate DESC 

它返回一个数据集,像这样:

╔══════════════╦═══════════╦══════════╦═════════════════════════╗ 
║ MaterialCode ║ LotNumber ║ Quantity ║  IssueDate  ║ 
╠══════════════╬═══════════╬══════════╬═════════════════════════╣ 
║  12345 ║ 3451972 ║  55 ║ 2016-10-25 10:48:13.210 ║ 
║  12346 ║ 3436055 ║  32 ║ 2016-10-25 09:57:26.693 ║ 
║  12346 ║ 3436055 ║  224 ║ 2016-10-25 09:47:54.077 ║ 
╚══════════════╩═══════════╩══════════╩═════════════════════════╝ 

我想通过IssueDate就这一点,而不是分组扩大,以获得小组中的最新日期。我曾尝试下面的代码,但它引发错误...because it is not contained in either an aggregate function or the GROUP BY clause.

SELECT 
TableA.MaterialCode, 
TableB.LotNumber, 
SUM(TableB.Quantity) AS Quantity, 
MAX(CONVERT(varchar(25), TableC.IssueDate, 121)) AS IssueDate 
FROM TableA 
INNER JOIN 
TableB ON TableA.PONumber = TableB.PONumber 
INNER JOIN 
TableC ON TableA.PONumber = TableC.PONumber 
WHERE TableC.VendorID = 'VendorID' 
AND TableC.IssueDate > '10/25/2016 9:47:53 AM' 
GROUP BY MaterialCode, LotNumber 
ORDER BY TableC.IssueDate DESC 

这是我希望得到与上述查询的输出:

╔══════════════╦═══════════╦══════════╦═════════════════════════╗ 
║ MaterialCode ║ LotNumber ║ Quantity ║  IssueDate  ║ 
╠══════════════╬═══════════╬══════════╬═════════════════════════╣ 
║  12345 ║ 3451972 ║  55 ║ 2016-10-25 10:48:13.210 ║ 
║  12346 ║ 3436055 ║  256 ║ 2016-10-25 09:57:26.693 ║ 
╚══════════════╩═══════════╩══════════╩═════════════════════════╝ 

我怎样才能改变我的查询来实现上述数据集?

+5

在这两个查询中,您选择'TableA.PONumber',但它不在结果集中,也不在'group by'中。我本来希望这两个查询都会失败。 – HoneyBadger

+3

此外,您应该在日期列上使用'max',并稍后转换为'varchar'。 'varchar'值上的'max'可以(通常会)导致意想不到的结果。 – HoneyBadger

+0

因此:应该在查询和输出中包含“TableA.PONumber”还是排除? –

回答

1

您的查询应该是

SELECT 
    a.MaterialCode, 
    b.LotNumber, 
    SUM(b.Quantity) AS Quantity, 
    CONVERT(varchar(25), MAX(c.IssueDate), 121) AS MaxIssueDate 
FROM TableA a 
INNER JOIN 
    TableB b ON a.PONumber = b.PONumber 
INNER JOIN 
    TableC c ON a.PONumber = c.PONumber 
WHERE c.VendorID = 'VendorID' 
    AND c.IssueDate > '10/25/2016 9:47:53 AM' 
GROUP BY a.MaterialCode, b.LotNumber 
ORDER BY MaxIssueDate DESC; 

如上述评论,如果你想在结果集中a.PONumber,然后在GROUP BY子句添加它。

SELECT MAX(CONVERT(varchar(25), TableC.IssueDate, 121)) AS IssueDate不是问题,这里的问题是你的ORDER BY子句。

您可以使用ORDER BY MAX(CONVERT(varchar(25), TableC.IssueDate, 121)),但最好像ORDER BY MaxIssueDate一样使用上面的代码。

+0

完美,谢谢! –