【问题标题】:How to create a dynamic pivot table SQL Server 2008如何创建动态数据透视表 SQL Server 2008
【发布时间】:2015-06-06 20:25:55
【问题描述】:

这就是我的 SQL Server 2008 数据库中的内容,我正在尝试数据透视表,但很难让它工作

Username     Date     hours
--------------------------------------
John       Feb 1995    45
John       Feb 1995    16      
Nancy      March 1998  25
John       May 2001   35.5
Peter      Feb 1995    46
Bill       May 2001    48
Bill       Feb 1995    56

我需要得到这个结果:

UserName   Feb 1995   March 1998   May 2001
--------   --------   ----------   ---------
John        61                      35.5
Nancy                    25
Peter       46
Bill        56                      48
--------------------------------------------
Total       163          25         83.5

基本上我需要从日期列值 (1995-10-01) 中获取所有值并将其作为列的标题,这是动态的,取决于表中有多少值。

非常感谢任何帮助

【问题讨论】:

    标签: sql-server dynamic pivot-table


    【解决方案1】:

    首先,一种方法:

    create table #tab (
                Username nvarchar(100),
                [Date] date,
                [hours] numeric(8,1)
            )
    
    insert #tab values 
        ('John', '1995-02-01', 45),
        ('John', '1995-02-01', 16),
        ('Nancy', '1998-03-01', 25),
        ('John', '2001-05-01', 35.5),
        ('Peter', '1995-02-01', 46),
        ('Bill', '2001-05-01', 48),
        ('Bill', '1995-02-01', 56)
    
    
    select  pvt.*
        from (
            select  Username, 
                    datename(month, [Date]) + ' ' + convert(nvarchar(20), datepart(year, [Date])) [Date], 
                    [hours] 
                from #tab
            ) t
        pivot (
            SUM([hours])
            for [Date] in ([February 1995], [March 1998], [May 2001])
            ) pvt
    
    drop table #tab
    

    现在,您可能需要这样做:

    create table #tab (
                Username nvarchar(100),
                [Date] date,
                [hours] numeric(8,1)
            )
    
    insert #tab values 
        ('John', '1995-02-01', 45),
        ('John', '1995-02-01', 16),
        ('Nancy', '1998-03-01', 25),
        ('John', '2001-05-01', 35.5),
        ('Peter', '1995-02-01', 46),
        ('Bill', '2001-05-01', 48),
        ('Bill', '1995-02-01', 56)
    
    declare @columns nvarchar(max) = ''
    declare @sql nvarchar(max) = ''
    declare @delim nvarchar(10) = ''
    
    select  @columns = @columns + @delim + '[' + x.[Date] + ']',
            @delim = ', '
        from (  
            select  datename(month, t.[Date]) + ' ' + convert(nvarchar(20), datepart(year, t.[Date])) [Date],
                    datepart(year, t.[Date]) [Year],
                    datepart(month, t.[Date]) [Month]
                from #tab t
            ) x
        group by x.[Date]
        order by MAX(x.[Year]), MAX(x.[Month])
    
    
    select @columns
    
    set @sql = '
        select  pvt.Username,
                ' + @columns + '
            from (
                select  Username, 
                        datename(month, [Date]) + '' '' + convert(nvarchar(20), datepart(year, [Date])) [Date], 
                        [hours] 
                    from #tab
                ) t
            pivot (
                SUM([hours])
                for [Date] in (' + @columns + ')
                ) pvt
        '
    
    exec(@sql)
    
    drop table #tab
    

    问题是 PIVOT 不允许您动态指定生成的列...您必须知道要执行此操作的列中的内容。解决方案是创建具有不同列的动态 SQL,然后在此基础上构建一个数据透视语句。

    【讨论】:

    • 感谢 Chris,您的解决方案有效,我所做的唯一更改是创建表,我使用 SELECT 从现有表中进入 #tab。一切都很好.. 现在我需要知道如何在数据透视表中添加每个月的每一列
    • 我正在尝试按年份排序列,但它不起作用,这就是我得到的:[2011 年 4 月]、[2010 年 12 月]、[2011 年 2 月]、[2011 年 1 月]、[ 2015 年 1 月]、[2011 年 3 月]、[2011 年 10 月]、[2011 年 9 月]
    • 抱歉耽搁了,上周 Stack Overflow 遇到了一些问题,我无法上传更改。我将生成列顺序的部分修改为按年/月排序,所以现在应该是按顺序排列的。
    • 嗨,克里斯,非常感谢您的更新修复了日期排序问题,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    相关资源
    最近更新 更多