【问题标题】:Problem in dynamic pivoting + sql server 2005动态旋转+ sql server 2005中的问题
【发布时间】:2009-10-25 09:51:06
【问题描述】:

我有问题。实际上在我们的应用程序中,之前允许客户每月支付 3 次分期付款,但现在可以是任意数字。所以我有较早的查询

declare @tbl table([MonthName] varchar(50), [Installment] int)

insert into @tbl select 'Jan',100 union all

select 'Jan',200 union all select 'Jan',300 union all

select 'Feb',100 union all

select 'Feb',200 union all select 'Feb',300



select [MonthName]

        ,[100] as '1st installment'

        ,[200] as '2nd installment'

        ,[300] as '3rd installment'

from

(select [MonthName],[Installment] from @tbl)as x

pivot

(max([Installment]) for [Installment] in

([100],[200],[300]))as pvt

输出是这样的

MonthName   1st installment 2nd installment 3rd installment

Feb             100              200            300

Jan             100              200            300

但正如我所说,现在分期付款可能会有所不同(比如在 1 个月内可能是 4,而在下个月可能是 5、3 或 6),那么在这种情况下如何使动态列旋转?

提前致谢

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql pivot


    【解决方案1】:

    您可以动态构建查询:

    declare @installment_list varchar(max)
    select @installment_list = IsNull(@installment_list,'') + 
        '[' + cast(Installment as varchar(32)) + '],'
    from #tbl
    group by Installment
    
    -- Remove last comma
    set @installment_list = left(@installment_list,len(@installment_list)-1)
    
    declare @dynquery varchar(max)
    set @dynquery = 'select * ' +
        'from #tbl ' +
        'pivot ( ' +
        '   max([Installment]) ' +
        '   for [Installment] ' +
        '   in (' + @installment_list + ') ' +
        ') as pvt'
    
    exec (@dynquery)
    

    请注意,表变量在 exec() 中不可见,因此我已更改为临时变量(#tbl 而不是 @tbl)。

    【讨论】:

      【解决方案2】:

      逐行,不能改变输出列数。

      如果我理解正确,您必须为最大列数构建它,并为未使用的列提供 NULL/0。

      编辑:这是 Andomar 正在做的,但他动态选择最大列数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多