3

私が理解している限り、最新の請求日とその請求日の年と月の組み合わせを取得しようとする SQL ビューがあります。これらの値は、その月の数量をカウントするために使用されます。

私の 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
4

2 に答える 2

0

以下のクエリは、最大日付をフォーマットに変換します。これは、最初に各日付の日付部分を変換してから、計算された varchar の最大値を取得するという間違った考えとは異なります。

また、'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 に答える