2

在 SQL Server 过程中,我需要获取与某些约束匹配的所有行(简单的 where 条件),然后按月对它们进行分组。

目标是创建一个图表(在 Sql server 报告服务中),它显示所有数据。

我已经有这样的事情了:

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条件的行,我将没有任何行。

结果是我有一个图表,从一月开始,跳过二月,然后显示三月。

我无法对数据进行后处理,因为它直接连接到 SQL Server Reporting 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);

如果它不是特定年份,那么您可以稍微不同地覆盖任何日期范围,只要您提供第一个月的第一天和上个月的第一天(或传递 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 回答