Как я могу назначить нормальную таблицу из динамической сводной таблицы?
Мне нужно сделать отчет в Stimulsoft за последние 12 месяцев с нашей текущей даты, я использовал динамическую сводную таблицу, чтобы сделать это, исходная таблица на рисунке 1
Тогда сводная таблица похожа на рисунок 2 (ссылка на увеличенное изображение здесь: )
Значение DACP_Value на рисунке 1 - это строка с датой, которой оно соответствует на рисунке 2. Обратите внимание, что для культуры установлено значение pt-BR (Бразилия)
Вот пример кода генерации сводной таблицы, выполненной в SQLFiddle
Мне нужно поместить эти динамические данные с заголовками в обычную таблицу (это может быть временная таблица), чтобы я мог использовать их в своем запросе к отчету и быть распознанным программным обеспечением Stimulsoft.
3 ответа
Добавлять INTO YourTable
после SELECT
в вашем коде:
DECLARE @Col NVARCHAR(MAX) =
( SELECT ', ' + QUOTENAME(CONVERT(VARCHAR, DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP) - (12 - Number), 0), 103)) + ' = [' + CAST(number AS VARCHAR) + ']'
FROM Master..spt_values
WHERE Type = 'P'
AND number BETWEEN 0 AND 12
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
DECLARE @SQL NVARCHAR(MAX) =
N'WITH Data AS
( SELECT DACP_ID,
DACP_Value,
[MonthNum] = 12 - DATEDIFF(MONTH, DACP_Date, CURRENT_TIMESTAMP)
FROM yourtable
WHERE DATEDIFF(MONTH, DACP_Date, CURRENT_TIMESTAMP) BETWEEN 0 AND 12
)
SELECT DACP_ID' + @Col + '
INTO YourTable --Add this line here
FROM Data
PIVOT
( SUM(DACP_Value)
FOR MonthNum IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
) pvt;'
EXECUTE SP_EXECUTESQL @SQL
Также это решение для случая, когда количество данных для каждой даты одинаково, т.е. идентификаторы для каждой даты одинаковы. Если нет, возможно, придется добавить дополнительные условия для отображения заголовков на левой стороне.
Как способ, вы можете использовать мастер-отчет в инструменте Stimulsoft. В качестве основной таблицы вы можете использовать таблицу только с датой:
SELECT CONVERT(DATE, DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP) - (12 - Number), 0), 103) AS DT,
CONVERT(VARCHAR(2),MONTH(DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP) - (12 - Number), 0))) + CONVERT(VARCHAR(4),YEAR(DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP) - (12 - Number), 0))) As MonthYear
FROM Master..spt_values
WHERE Type = 'P'
AND number BETWEEN 0 AND 12
Подробная таблица "yourTable" с дополнительным столбцом:
select *, convert(varchar(2),Month(DACP_date)) + convert(varchar(4),Year(DACP_date)) as MonthYear from yourtable
Реализация на столбцы MonthYear. В отчете вы можете использовать компонент Cross-Data для основных данных и компонент DataBand для подробных данных. Пожалуйста, смотрите изображение по следующей ссылке: http://imgur.com/Ve03BXU