0

これは簡単なはずですが、理解できないようです。Artifact名前などのあるテーブルがありますModification_Date。月ごとのドキュメント変更のカウントを取得しているクエリがあります。変更がなかった数か月があります。クエリとグループ化を行っているModification_Dateため、変更を加えずにそれらの月の結果は返されません。理想的には、結果セットでその月を指定し、に0を指定しQuantityます。

SELECT CONVERT(NVARCHAR(7), Modification_Date, 120) [Month], 
    COUNT(Artifact) as Quantity
    FROM table
WHERE Modification_Date > DATEADD(month, -6, getdate())
GROUP BY CONVERT(NVARCHAR(7), Modification_Date, 120)
ORDER BY [Month] DESC

これにより、次のような結果が得られます。

Month       Quantity
-------     --------
2013-02     10
2012-11     12
2012-10     5
2012-09     29

ご覧のとおり、2012年12月と2013年1月は結果セットに含まれていません。QuantitySQLレポートの棒グラフでそのデータを使用し、それらの月を0の値で表すことができるように、それらの月を0で表したいと思います。現在、棒グラフでは、それらの月を完全にスキップしています。yyyy-mm Month?を使用するだけでなく、過去6か月の列を生成する方法はありModification_Dateますか?

4

1 に答える 1

5

日付を文字列に変換して時刻や曜日を削除しないでください。日付演算を使用してください。文字列への変換は効率が悪く、テーブル全体をスキャンする必要もあります。

固定長の文字列に変換する場合は、を使用せずNVARCHAR、を使用してCHARください。数値の日付でサポートする必要があるUnicode文字は何ですか?ウムラウト?ポンドサイン?象形文字?

これは、カタログビューを使用して6行を生成し、現在の日付から数か月離れて過去6か月でグループ化する例です(Modification_Date現在のアプローチとは異なり、インデックスを使用する必要があります)。これを初めて見たときは完全に直感的ではありませんが、ループのないセットの生成に関する私のシリーズを見ることができます(パート1 |パート2 |パート3)。

;WITH x(m) AS 
(
  SELECT TOP 6 DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) 
    - (ROW_NUMBER() OVER (ORDER BY [object_id])), 0) 
  FROM sys.all_objects
  ORDER BY [object_id]
)
SELECT [Month] = x.m, Quantity = COALESCE(COUNT(t.Artifact), 0)
FROM x
LEFT OUTER JOIN dbo.tablename AS t
ON t.Modification_Date >= x.m
AND t.Modification_Date < DATEADD(MONTH, 1, x.m)
GROUP BY x.m
ORDER BY x.m DESC;

これには当月は含まれないことに注意してください。9月->2月ではなく10月->3月を含めるようにシフトする場合は、次の行を変更するだけです。

+ 1 - (ROW_NUMBER() OVER (ORDER BY [object_id])), 0) 

また、フォーマットYYYY-MMが絶対に必要な場合は、次のように実行できます。

;WITH y(m) AS 
(
  SELECT TOP 6 DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) 
    - (ROW_NUMBER() OVER (ORDER BY [object_id])), 0) 
  FROM sys.all_objects
  ORDER BY [object_id]
),
x([Month], Quantity)
AS
(
  SELECT [Month] = y.m, Quantity = COALESCE(COUNT(t.Artifact), 0)
  FROM y
  LEFT OUTER JOIN dbo.tablename AS t
  ON t.Modification_Date >= y.m
  AND t.Modification_Date < DATEADD(MONTH, 1, y.m)
  GROUP BY y.m
)
SELECT [Month] = CONVERT(CHAR(7), [Month], 120), Quantity
FROM x
ORDER BY [Month] DESC;
于 2013-03-06T01:46:04.727 に答える