在SQL Server过程中,我需要获取所有匹配某些约束的行(简单的条件),然后按月分组。
目标是创建一个图形(在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
条件的行,我将不会有任何行行。
结果是我有一个图表从1月开始,跳过2月,然后显示3月。
我无法对数据进行后期处理,因为它直接连接到SQL Server Reporting Services报告。
由于我对~20存储过程存在这个问题,我将很感激有最简单的方法。
非常感谢你的建议
答案 0 :(得分: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天和上个月的第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);
答案 1 :(得分:0)
在报表生成器中,右键单击日期轴,选择属性,然后将轴设置为日期范围,它将为您添加空列,您不必更改SQL
答案 2 :(得分:0)
您需要构建一个表(Table变量最适合此处),其中包含从最小值到最大值的所有年/月组合。
然后,您需要将此与您的主查询交叉加入,以获得图表所有年/月的结果。