我有一个 SQL View ,据我所知,它试图获取最新的发票日期以及该发票日期的年月组合。然后使用这些值来计算该月的数量。
我的 SQL 知识很基础,我不确定为什么这个人会做这部分:
MAX(CONVERT(varchar(3), InvoiceDate, 101) + CONVERT(varchar(4),
YEAR(InvoiceDate))) AS YearMonth
其余的代码,包括 TOP(100) PERCENT 部分等,我相当满意。
我不确定所讨论的部分是否存在逻辑错误,或者它是否具有某些 SQL 或业务原因,因为在某些情况下它与最大发票日期完全不同。
完整的 SQL 表达式如下:
SELECT TOP (100) PERCENT
MAX(InvoiceDate) AS MaxInvoiceDate,
StockCode, Warehouse,
MAX(CONVERT(varchar(3), InvoiceDate, 101) + CONVERT(varchar(4), YEAR(InvoiceDate))) AS YearMonth
FROM dbo.ArTrnDetail
GROUP BY StockCode, Warehouse
HAVING (Warehouse = 'CS') OR
(Warehouse = 'PS') OR
(Warehouse = 'DS') OR
(Warehouse = 'JS') OR
(Warehouse = 'JN')
ORDER BY MaxInvoiceDate DESC
还有一个可能有问题的输出:
MaxInvoiceDate | StockCode | Warehouse | YearMonth
----------------------------------------------------------------
2013-08-21 00:00:00.000 | ACH045 | PS | 12/2012
最佳答案
这很有趣,但也有道理。字符串“12”将成为任何月份公式中的 MAX 字符串,并且该记录转到前一年,如果实际最大值发生在 2013 年 8 月,这也有意义。修复它的最简单方法是移动MAX 在转换中,因此您要转换第一列中的相同日期:
SELECT TOP (100) PERCENT
MAX(InvoiceDate) AS MaxInvoiceDate,
StockCode, Warehouse,
CONVERT(varchar(3), MAX(InvoiceDate), 101) + CONVERT(varchar(4), YEAR(MAX(InvoiceDate))) AS YearMonth
FROM dbo.ArTrnDetail
GROUP BY StockCode, Warehouse
HAVING (Warehouse = 'CS') OR
(Warehouse = 'PS') OR
(Warehouse = 'DS') OR
(Warehouse = 'JS') OR
(Warehouse = 'JN')
ORDER BY MaxInvoiceDate DESC
至于原程序员为什么不在前半部分使用日期部分,它很巧妙,你通过获取 MM/DD/YYYY 的前 3 个字符免费获得 '/' 字符。这不是我想到的,但它实际上为您节省了命令或字符串连接。
关于SQL Convert(Date + Year(Date)) 在别人的代码中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39226856/