如何从动态数据透视表中分配普通表?

时间:2013-02-01 19:03:24

标签: sql report pivot-table stimulsoft

我需要在当前日期的最后12个月内在Stimulsoft进行报告,我使用动态数据透视表来制作此表,原始表格如图1所示

Original table data

然后数据透视表就像图2(这里有更大的图像链接:http://i.stack.imgur.com/LPCuP.jpg

pivot table

图1中的DACP_Value是图2中对应日期的行。注意文化设置为pt-BR(巴西)

以下是在SQLFiddle中生成数据透视表的示例代码

http://www.sqlfiddle.com/#!3/3205a/23

我需要将这些动态数据与标头放在普通表中(它可以是临时表),这样我就可以在报表查询中使用它并被Stimulsoft软件识别。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

作为一种方式,您可以在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列上的实现。 在报告中,您可以将交叉数据组件用于主数据,将DataBand组件用于详细数据。 请参阅以下链接中的图像: http://imgur.com/Ve03BXU

答案 2 :(得分:0)

对于每个日期的数据量相同的情况,这也是一种解决方案,即每个日期的ID相同。如果没有,可能需要添加更多条件来显示左侧的标题。