2

SQL Serverの手順では、いくつかの制約(条件が単純な場合)に一致するすべての行を取得してから、月ごとにグループ化する必要があります。

目標は、すべてのデータを表示するグラフを(SQLサーバーレポートサービスで)作成することです。

私はすでにこのようなものを持っています:

Select Count(*) AS Count, Month(a.issueDate) AS Month, Year(a.issueDate) AS Year
FROM MyTable a
WHERE
....
GROUP BY YEAR(a.issueDate), MONTH(a.issueDate)

データを取得し、グラフを取得しましたが、問題は、条件にMyTable一致する ""の行がない場合、行がないことです。Where

その結果、1月から始まり、2月をスキップして、3月を表示するグラフが作成されました。

データはSQLServerReporting Servicesレポートに直接接続されているため、後処理できません。

私は約20のストアドプロシージャでこの問題を抱えているので、最も簡単な方法でそれを行うことができれば幸いです。

アドバイスありがとうございます

4

3 に答える 3

3

特定の年が必要だとしましょう。

DECLARE @year INT;
SET @year = 2012;

DECLARE @start SMALLDATETIME;
SET @start = DATEADD(YEAR, @year-1900, 0);

;WITH y AS (SELECT TOP (12) rn = ROW_NUMBER() OVER (ORDER BY [object_id])-1
  FROM sys.all_objects ORDER BY [object_id])
SELECT DATEADD(MONTH, y.rn, @start), COUNT(t.issueDate)
  FROM y
  LEFT OUTER JOIN dbo.MyTable AS t
  ON t.issueDate >= DATEADD(MONTH, y.rn, @start)
  AND t.issueDate < DATEADD(MONTH, y.rn + 1, @start)
GROUP BY DATEADD(MONTH, y.rn, @start);

特定の年でない場合は、最初の月の1日と先月の1日を指定する(または4つの整数を渡して手動で日付を作成する)限り、任意の日付範囲をカバーするために少し異なる方法で行うことができます。 )::

DECLARE @startdate SMALLDATETIME, @enddate SMALLDATETIME;
SELECT @startdate = '20111201', @enddate = '20120201';

;WITH y AS (SELECT TOP (DATEDIFF(MONTH, @startdate, @enddate)+1)
    rn = ROW_NUMBER() OVER (ORDER BY [object_id])-1
    FROM sys.all_objects ORDER BY [object_id]
)
SELECT DATEADD(MONTH, y.rn, @startdate), COUNT(t.issueDate)
  FROM y
  LEFT OUTER JOIN dbo.MyTable AS t
  ON t.issueDate >= DATEADD(MONTH, y.rn, @startdate)
  AND t.issueDate < DATEADD(MONTH, y.rn + 1, @startdate)
GROUP BY DATEADD(MONTH, y.rn, @startdate);
于 2012-07-05T15:10:42.943 に答える
0

レポートビルダーで、日付軸を右クリックし、プロパティを選択してから、軸を日付範囲として設定すると、空の列が追加されるため、SQLを変更する必要はありません。

于 2012-07-05T15:11:17.543 に答える
0

最小から最大までのすべての年/月の組み合わせを含むテーブルを作成する必要があります(ここではテーブル変数が最適です)。

次に、これをメインクエリと相互結合して、グラフの準備ができているすべての年/月の結果を取得する必要があります。

于 2012-07-05T15:11:30.023 に答える