2014-12-05 7 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 

Есть ли способ, в котором я могу присвоить нулевые значения в остальные месяцы, так что они показывают, как, например, в диаграмме колонке? До сих пор я пытался создать набор данных, который извлекал все месяцы, и использовал выражение поиска для параметра my month, но это ничего не делало. Я также попытался проверить мое предложение 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 (мм, c.expireson). temp - таблица @forecast. – Sabr786

+0

Убедитесь, что ваш запрос выглядит следующим образом: SELECT COUNT (c.statecodename) AS кодовому, c.statecodename, f.mm AS Месяц, f.yy AS Год, DATEPART (гггг, c.expireson) AS YearNum, DATEPART (м, c.expireson) КАК MonthNum оТ @forefast е левое внешнее соединение Table1 как С на f.yy = DATENAME (YYYY, c.expireson) и f.mm = DATENAME (мм, гр .expireson) –

+0

Я исправил его, как вы упомянули, но я все еще не могу отображать все месяцы. Я попытался удалить параметр, и в моем запросе попытался проверить значение параметра datename на определенный месяц, и я все еще не могу получить все отображаемые месяцы. Есть ли причина, почему это может быть так? – Sabr786

Смежные вопросы