3

我有一个 SQL 视图,据我了解,它试图获取最新的发票日期以及该发票日期的年月组合。然后使用这些值计算该月的数量。

我的 SQL 知识是基本的,我不确定这个人为什么会做这部分:

MAX(CONVERT(varchar(3), InvoiceDate, 101) + CONVERT(varchar(4), 
                  YEAR(InvoiceDate))) AS YearMonth

其余的代码,包括 TOP(100) PERCENT 部分等,我很满意。

我不确定有问题的部分是否是逻辑错误,或者它是否有一些 SQL 或业务原因,因为在某些情况下它与 Max Invoice Date 完全不同。

完整的 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
4

2 回答 2

1

这很有趣,但也有道理。字符串“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 个字符来免费获得 '/' 字符。这不是我能想到的,但它实际上为您节省了命令或字符串连接。

于 2016-08-30T12:53:32.323 回答
0

下面的查询将最大日期转换为一种格式。这与首先​​转换每个日期的日期部分然后获得计算的 varchars 的最大值的错误想法不同。

对于名为“YearMonth”的计算列,人们会期望一个以年开头然后是月的值。(对 YYYY/MM 格式进行排序也更容易)

SELECT TOP (100) PERCENT    
    StockCode, Warehouse, 
    MAX(InvoiceDate) AS MaxInvoiceDate, 
    CONVERT(varchar(7), MAX(InvoiceDate), 111) as YearMonth
FROM dbo.ArTrnDetail
WHERE Warehouse in ('CS','PS','DS','JS','JN')
GROUP BY StockCode, Warehouse
ORDER BY MaxInvoiceDate DESC;

给出:

MaxInvoiceDate       StockCode  Warehouse   YearMonth
21.08.2013 00:00:00  ACH045     PS          2013/08

请注意,HAVING 已使用 WHERE 子句进行切换。
这将给出相同但可能更快的结果。

如果无论如何都首选 MM/DDDD 格式,那么它将以该格式计算。

RIGHT(CONVERT(varchar(10), MAX(InvoiceDate), 103),7) as MonthYear
于 2016-08-30T13:34:56.940 回答