SSRS 2008R2 - фиксированные группы строк / столбцов

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

У меня есть группы столбцов для дат, и у меня есть группа строк для состояния задания (отменено или нет) и статуса. Моя проблема возникает, когда у меня есть день без работы или месяц без отмены определенного типа. В моих требованиях указано, что макет отчета должен быть фиксированным, и эти строки / столбцы должны все еще существовать, но иметь только состояние 0. Что еще хуже, количество различных статусов для одного состояния задания (отменено) само по себе является динамическим и извлекается из таблицы, хотя количество статусов для другого состояния задания (не отменено) фиксировано.

У меня вопрос, могу ли я сформировать такой макет отчета:

http://i.stack.imgur.com/0UNZU.jpg

Из этих наборов данных ?:

http://i.stack.imgur.com/zsqNw.jpg

-с SSRS, или я застрял в том, что мне просто нужно продолжать трюки SQL, чтобы заставить этот макет?


person BVartin    schedule 17.03.2014    source источник


Ответы (1)


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

Исходя из того, что вы написали, вам нужно Common Табличные выражения и сводная таблица с динамические столбцы.

Вот код:

--
-- We create the needed schemas and fill them with your data.
--    

CREATE TABLE Jobs(Date DATE, State NVARCHAR(32), Status NVARCHAR(32));
CREATE TABLE CancellationTypes (State NVARCHAR(32), Reasons NVARCHAR(32));

--
-- Added the Status column so we can get the cancellation types before
-- the jobs. This way we can get the zeros you need.
--

INSERT INTO CancellationTypes VALUES('Cancelled', 'Weather');
INSERT INTO CancellationTypes VALUES('Cancelled', 'Equipment Failure');
INSERT INTO CancellationTypes VALUES('Cancelled', 'Staff Caused');
INSERT INTO CancellationTypes VALUES('Cancelled', 'Misc');
INSERT INTO CancellationTypes VALUES('Not Cancelled', 'Completed');
INSERT INTO CancellationTypes VALUES('Not Cancelled', 'Partially Completed');

--
-- No changes here...
--

INSERT INTO Jobs VALUES('20140301', 'Cancelled',     'Weather');
INSERT INTO Jobs VALUES('20140301', 'Cancelled',     'Weather');
INSERT INTO Jobs VALUES('20140301', 'Cancelled',     'Equipment Failure');
INSERT INTO Jobs VALUES('20140301', 'Not Cancelled', 'Completed');
INSERT INTO Jobs VALUES('20140302', 'Not Cancelled', 'Completed');
INSERT INTO Jobs VALUES('20140302', 'Not Cancelled', 'Partially Completed');
INSERT INTO Jobs VALUES('20140305', 'Cancelled',     'Weather');
INSERT INTO Jobs VALUES('20140305', 'Cancelled',     'Equipment Failure');
INSERT INTO Jobs VALUES('20140305', 'Cancelled',     'Staff Caused');
INSERT INTO Jobs VALUES('20140305', 'Not Cancelled', 'Completed');
INSERT INTO Jobs VALUES('20140305', 'Not Cancelled', 'Partially Completed');

DECLARE @Headers NVARCHAR(158), @Query NVARCHAR(4000);

--
-- With the CTE we can get our range of dates and use it to create the
-- columns for the final resultset.
--

DECLARE @StartDate AS DATE = '20140301', @EndDate DATE = '20140305';
WITH Dates AS (
    SELECT @StartDate AS Day
    UNION ALL
    SELECT DATEADD(D, 1, Day) FROM Dates WHERE Day < @EndDate
)
SELECT @Headers = STUFF((SELECT DISTINCT '],[' + CONVERT(VARCHAR(10), Day, 101) FROM Dates ORDER BY '],[' + CONVERT(VARCHAR(10), Day, 101) FOR XML PATH('')), 1, 2, '') + ']';

SET @Query =
'SELECT State, Status, ' + @Headers + ' FROM
(
    SELECT
        CONVERT(VARCHAR(10), J.Date, 101) AS Date,
        CT.State,
        CT.Reasons AS Status
    FROM CancellationTypes AS CT
    -- This can give us cancellation types with 0 jobs.
    LEFT JOIN Jobs AS J ON CT.Reasons = J.Status AND CT.State = J.State
) t
PIVOT (COUNT(Date) FOR Date IN (' + @Headers + ')) AS pvt ORDER BY pvt.State'

EXECUTE (@Query);

--
-- We're done here...
--
DROP TABLE Jobs;
DROP TABLE CancellationTypes;

... и результаты:


State         Status              03/01/2014  03/02/2014  03/03/2014  03/04/2014  03/05/2014
------------- ------------------- ----------- ----------- ----------- ----------- -----------
Cancelled     Equipment Failure   1           0           0           0           1
Cancelled     Misc                0           0           0           0           0
Cancelled     Staff Caused        0           0           0           0           1
Cancelled     Weather             2           0           0           0           1
Not Cancelled Completed           1           1           0           0           1
Not Cancelled Partially Completed 0           1           0           0           1

Надеюсь это поможет.

person MJVC    schedule 03.07.2014