2016-10-26 73 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

完美,謝謝! –