Sql 如何计算日期范围内的数据库元素?

Sql 如何计算日期范围内的数据库元素?,sql,sql-server,reporting-services,group-by,Sql,Sql Server,Reporting Services,Group By,在SQL Server过程中,我需要获取与一些约束Simple where条件匹配的所有行,然后按月对它们进行分组 目标是在Sql server reporting services中创建一个图形,显示所有数据 我已经说过这样的话: Select Count(*) AS Count, Month(a.issueDate) AS Month, Year(a.issueDate) AS Year FROM MyTable a WHERE .... GROUP BY YEAR(a.issueDate)

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

目标是在Sql server reporting services中创建一个图形,显示所有数据

我已经说过这样的话:

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)
我得到了我的数据,我得到了我的图表,但问题是,如果我的表中没有任何符合Where条件的行,我就不会有任何行

结果是我得到了一个从一月开始,跳过二月,然后显示三月的图表

我无法对数据进行后期处理,因为它直接连接到SQL Server Reporting Services报表

由于我对~20个存储过程有这个问题,我希望能用最简单的方法来解决这个问题


非常感谢您的建议

假设您想要一个特定的年份:

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);

在报表生成器中,右键单击日期轴,选择属性,然后将该轴设置为日期范围,它将为您添加空列,并且您无需更改SQL

您需要构建一个表。在这里,表变量最适合包含从最小值到最大值的所有年/月组合


然后,您需要将其与主查询交叉连接,以获得所有年份/月份的结果,为图表做好准备。

这很好:似乎很好,但是否有方法仅在同一年内迭代?我对Syntax不太了解,也找不到如何处理从12月到2月的时间。我试过你的例子,但是,如果在这个范围内没有与ON constraintno元素匹配的东西,我仍然会得到计数*中的1,因为它是一个左连接。问题是,如果我使用NOTNULL进行过滤,我会遇到初始问题,在没有为空行返回任何行的情况下,我想我找到了一些东西:如果我对联接表上的列进行计数,如果值为null,我将得到0。我明天将尝试:如果它有效,将是更好的解决方案。我只是不知道我是否可以只显示月份+年份而不是日期。所以我尝试了你的建议,我在X轴上得到了几个新标签,但我在Y轴上没有数据点,甚至没有0,所以因为这是一个曲线图,我只得到了真正存在的点之间的曲线。因为你没有显示连续数据,你确定曲线是最合适的图表类型吗?我显示的是连续数据,每个月的元素数,但如果一个月内有0个元素,这并不意味着它不是连续的。我相信个别月份是离散的,不是连续的,你不能有一个半月。