2014-12-05 94 views
0

我有一个SSRS柱状图,其中包含x轴的两个类别组,分别基于年份和日期对数据进行排序。我还在图表上有一个参数,最终用户可以选择他们希望查看数据的月份,图表显示与该月相关的任何数据。我试图做的是让图表显示所有月份的列,即使没有可用的信息(理想情况下,我希望该月显示0是没有数据),而不仅仅是有数据基于过滤器的月份。这是查询我在我的数据集:在没有数据的柱状图中显示月份

SELECT COUNT(c.statecodename) AS codename, 
     c.statecodename, 
     DATENAME(mm, c.expireson) AS Month, 
     DATENAME(yyyy, c.expireson) AS Year, 
     DATEPART(yyyy, c.expireson) AS YearNum, 
     DATEPART(m, c.expireson) AS MonthNum 

FROM Table1 AS c 

WHERE (c.expireson IS NOT NULL) 
AND (DATENAME(mm, c.modifiedon) IN (@ReportParameter1)) 


GROUP BY DATENAME(mm, c.expireson), 
       DATENAME(yyyy, c.expireson), 
       DATEPART(yyyy, c.expireson), 
       DATEPART(m, c.expireson), 
       c.statecodename 

UNION ALL 

SELECT COUNT(d.statecodename) AS codename, 
     d.statecodename collate DATABASE_DEFAULT, 
     DATENAME(mm, d.expireson) AS Month, 
     DATENAME(yyyy, d.expireson) AS Year, 
     DATEPART(yyyy, d.expireson) AS YearNum, 
     DATEPART(m, d.expireson) AS MonthNum 

FROM Table2 AS d 

WHERE (d.expireson IS NOT NULL) 
AND (DATENAME(mm, d.modifiedon) IN (@ReportParameter1)) 

GROUP BY DATENAME(mm, d.expireson), 
      DATENAME(yyyy, d.expireson), 
      DATEPART(yyyy, d.expireson), 
      DATEPART(m, d.expireson), 
      d.statecodename 

ORDER BY YearNum, MonthNum 

是否有这使他们的柱形图中显示为这样我可以分配空值的几个月的休息方式吗?到目前为止,我已经尝试创建一个检索所有月份的数据集,并为我的月份参数使用查找表达式,但是这没有做任何事情。我也试图在我的WHERE子句中检查DATENAME(mm,c.expireson)IS NULL,但那也没有奏效。任何人都可以为我提供一种方法来完成这个任务吗?提前致谢!

回答

0

与年份和月份像这样创建一个临时或变量表:

从左边是表中选择的年份和月份加入到你上面列出的年份和月份查询。

declare @date as datetime 
declare @forecast TABLE ([yy] int, [mm] varchar(15)) 
set @date = getdate() 
While (select datediff(m,@date,getdate())) > -12 
Begin 
Insert into @forecast (yy, mm) values (datepart(year,@date),datename(month,@date)) 
set @date = dateadd(m,-1,@date) 
IF (select datediff(m,@date,getdate())) > 23 
Break 
Else 
Continue 
END 

SELECT f.yy, f.mm, 
a.codename, 
a.statecodename 
FROM @forecast f 
LEFT OUTER JOIN 
(
SELECT COUNT(c.statecodename) AS codename, 
     c.statecodename, 
     DATENAME(mm, c.expireson) AS Month, 
     DATENAME(yyyy, c.expireson) AS Year 
FROM Table1 AS c 

WHERE (c.expireson IS NOT NULL) 
AND (DATENAME(mm, c.modifiedon) IN (@ReportParameter1)) 

GROUP BY DATENAME(mm, c.expireson), 
     DATENAME(yyyy, c.expireson), 
     c.statecodename 

UNION ALL 

SELECT COUNT(d.statecodename) AS codename, 
     d.statecodename collate DATABASE_DEFAULT, 
     DATENAME(mm, d.expireson) AS [Month], 
     DATENAME(yyyy, d.expireson) AS [Year] 

FROM Table2 AS d 

WHERE (d.expireson IS NOT NULL) 
AND (DATENAME(mm, d.modifiedon) IN (@ReportParameter1)) 

GROUP BY DATENAME(mm, d.expireson), 
      DATENAME(yyyy, d.expireson), 
      d.statecodename 
     ) a 
on f.yy = a.[year] and f.mm = a.[month] 
+0

您好,我试图实现此代码来创建临时表。但是,在运行代码时,我收到一条错误消息:'无法找到任何一列“c”或用户定义的聚合“c.DATENAME”,或名称不明确。这发生在我执行左连接temp.mm = c.DATENAME(mm,c.expireson)时。 temp是@forecast表。 – Sabr786 2014-12-08 15:00:54

+0

确保您的查询如下所示:SELECT COUNT(c.statecodename)AS代号, c.statecodename, f.mm为月, f.yy截至今年, DATEPART(YYYY,c.expireson)AS YearNum, DATEPART(米,c.expireson)AS MonthNum FROM @forefast˚F LEFT OUTER JOIN 表1 AS上f.yy = DATENAME(YYYY,c.expireson) 和f.mm = DATENAME C(毫米,C .expireson) – 2014-12-09 14:19:08

+0

我修正了它,正如你所提到的,但我仍然无法显示所有的月份。我试图删除参数,并在我的查询尝试测试设置日期名称到一个特定的月份,我仍然无法获得所有月份显示。这有可能是有原因的吗? – Sabr786 2014-12-09 14:28:07