私の知る限り、最新の請求書日付とその請求書日付の年と月の組み合わせを取得しようとするSQLビューがあります。これらの値は、その月の数量を数えるために使用されます。誰かのコードでのSQLの変換(日付+年(日付))
マイSQLの知識が基本であると私は、なぜ人はこの部分を行うだろうかわからない:
MAX(CONVERT(varchar(3), InvoiceDate, 101) + CONVERT(varchar(4),
YEAR(InvoiceDate))) AS YearMonth
コードの残りの部分などTOP(100)PERCENT部を含む、私はかなりしていますに満足。
問題のパーツがロジックミスであるかどうか、また場合によってはMax Invoice Dateとは異なる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
なぜ誰かが最大のMM/YYYYを望むのかわかりません。それは正しく見えませんが、おそらくいくつかの不可解な理由があります。 –
'InvoiceDate'が実際の' date'または 'datetime'または' datetime2'型の場合、 'CONVERT'の代わりに' DATEPART' sql関数を使うことができます。それを文字列に変換する行為は、ビューのコンシューマーの便宜のためのものかもしれませんが、なぜそれが正しいかを見るためには、そのコードを参照する必要があります。 – Igor
ビューからORDER BYを取り除いてください。それは役に立たないだけでなく、実際にパフォーマンスを傷つける可能性があります。注文は、SQL Serverで実際に行う必要がある場合は、一番外側のクエリの一部にする必要があります。 – dean