【问题标题】:How can I assign a normal table from a dynamic pivot table?如何从动态数据透视表中分配普通表?
【发布时间】:2013-02-01 19:03:24
【问题描述】:

我需要从我们当前日期的过去 12 个月中在 Stimulsoft 中制作一份报告,我使用动态数据透视表来制作这个,原始表格在图 1 中

然后数据透视表就像图 2 一样(此处为大图链接:http://i.stack.imgur.com/LPCuP.jpg

图 1 中的 DACP_Value 是与图 2 对应的日期所在的行。请注意,区域性设置为 pt-BR(巴西)

这里是用SQLFiddle制作的数据透视表的生成示例代码

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

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

【问题讨论】:

    标签: sql report pivot-table stimulsoft


    【解决方案1】:

    在您的代码上的SELECT 之后添加INTO YourTable

    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
    

    【讨论】:

    • 使用 INTO YourTable,您可以将数据放入该表(不是临时表)。然后,您可以在 Stimulsoft 中使用该表。我可能只是建议在运行之前删除该表。这是小提琴:sqlfiddle.com/#!3/3205a/34
    • 感谢 Lamark,但我要做的是将@SQL 变量放入一个临时表中,这样我就可以将动态 sql 中的所有列映射到 stimulsoft 中以生成报告
    • 我需要在stimulsoft中选择列,不能用存储过程来完成
    【解决方案2】:

    作为一种方式,您可以使用 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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 每个日期的id都是一样的,谢谢,等待示例文件,我认为这是一个比使用sql本身更好的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2010-12-28
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多