SSRS: как показать весь месяц года в виде оси X графика

Я работаю над графиком, который показывает данные за весь год, но, поскольку я новичок, я не могу понять, как показать весь месяц по оси X (включая те, у которых нет данных)

Вот часть SELECT моего запроса SQL:

SELECT DISTINCT
    AB.Id AS ID,
    MONTH(AP.Date) AS Date

В результате чего получаются следующие данные:

|   ID   |  Date  |
|--------|--------|
|   1    |   2    |
|   2    |   3    |
|   3    |   2    |
|   4    |   2    |
|   5    |   3    |
|   6    |   3    |
|   7    |   3    |
|--------|--------|

В настоящее время я использую =MonthName(Fields!Date.Value)) как группа категорий, что приводит к следующему графику:

4|            X
3|    X
2|
1|
0|_________________
   February  March  

То, что я хочу иметь, это что-то вроде этого:

4|                      X
3|              X
2|
1|
0|______________________________________
   January  February  March  April  ...

Я нашел какой-то обходной путь в сети, используя пользовательскую таблицу в базе данных, но я не могу в этом случае, так как это проект MS Dynamics.

Спасибо за ваше время.

2 ответа

Решение

Вам необходимо вернуть правильные данные на график, чтобы на оси было что-то включить. Для этого вам нужно сгенерировать каждое значение по оси X, а затем найти сумму, которая к нему относится.

В приведенном ниже сценарии я создаю таблицу дат, которая представляет начало месяца для каждого месяца текущего года. Затем он идет и находит все соответствующие значения в вашей таблице за этот месяц и делает count, Затем его можно использовать в качестве набора данных диаграммы с минимальной обработкой на стороне клиента, что поможет повысить производительность отчета.

declare @t table(ID int,DateValue Date)
insert into @t values (1,'20170204'),(2,'20170307'),(3,'20170203'),(4,'20170207'),(5,'20170304'),(6,'20170302'),(7,'20170309');

with d(d) as(select cast(dateadd(mm,n,dateadd(yyyy,datediff(yyyy,0,getdate()),0)) as date) from(values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)) n(n))
select d.d
        ,count(t.ID) as c
from d
    left join @t t
        on(d.d = dateadd(mm,datediff(mm,0,t.DateValue),0))
group by d.d
order by d.d;

Выход:

+------------+---+
|     d      | c |
+------------+---+
| 2017-01-01 | 0 |
| 2017-02-01 | 3 |
| 2017-03-01 | 4 |
| 2017-04-01 | 0 |
| 2017-05-01 | 0 |
| 2017-06-01 | 0 |
| 2017-07-01 | 0 |
| 2017-08-01 | 0 |
| 2017-09-01 | 0 |
| 2017-10-01 | 0 |
| 2017-11-01 | 0 |
| 2017-12-01 | 0 |
+------------+---+

Вы можете добавить правильное объединение к вашему запросу со всем месяцем и вернуть его столбец к выводу:

SELECT DISTINCT
    AB.Id AS ID,
    m.n AS Date
   right join (select * from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) m(n) ) m
   on MONTH(AP.Date)=m.n
Другие вопросы по тегам