【问题标题】:SQL Server - Dynamic Pivot Query [duplicate]SQL Server - 动态数据透视查询 [重复]
【发布时间】:2015-08-14 16:21:46
【问题描述】:

我一直在阅读此板上的各种示例,但无法生成适合我的代码的动态数据透视查询。任何帮助,将不胜感激!

我有两张桌子

辅助定义

Fieldnumber  Fieldlabel
------------------------
1            Buyer
2            Size Range
3            Source
4            Country
5            Vendor
ect...       ect...

辅助字段

PageID   FieldNumber   TextValue
-----------------------------------
1        1             Sam
1        2             S-L
1        3             Domestic
1        4             Canada
2        1             Kyla
2        3             Import
2        5             VendorName
2        6             Off-Shore
2        7             Fit 1
2        8             Yes
4        1             Sara
4        3             Import
4        4             China
ect..    ect..         ect..

我想做的是创建一个动态数据透视表,它通过字段编号连接两个表,并将字段标签用作 pageid 之后的列标题。它看起来与此类似。

PageID   Buyer     Size Range   Source     Country   Vendor      Type       Status   Exclusive   ect..
------------------------------------------------------------------------------------------------
1        Sam       S-L          Domestic   Canada 
2        Kyla                   Import              VendorName  Off-Shore   Fit 1    Yes
4        Sara                   Import     China

我已经尝试过此站点上的示例,但是当我用自己的字段替换字段或在实际的列生成中时,我总是遇到错误。

【问题讨论】:

  • 你能贴出你试过的代码吗?它返回的错误是什么?

标签: sql sql-server pivot pivot-table


【解决方案1】:

您将需要创建一个动态枢轴(感谢@bluefeet's answer here) 类似这样的内容:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.FieldLabel) 
            FROM auxdef c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT PageID, ' + @cols + ' from 
            (
             select 
                 PageId,
                 FieldLabel,
                 TextValue
            from AuxFields af
            inner join auxdef ad on af.FieldNumber = ad.FieldNumber
           ) x
            pivot 
            (
                 max(TextValue)
                for FieldLabel in (' + @cols + ')
            ) p '


execute(@query);

SQL Fiddle Demo

【讨论】:

    【解决方案2】:

    这是另一种方式

    sql fiddle

    declare @sql nvarchar(max)
    select @sql = 'select af.pageId'
    
    select @sql = @sql + ', max(case when ad.fieldLabel = ''' + ad.fieldLabel + ''' then af.textValue end) as [' + ad.fieldLabel + ']' + char(13)
    from auxDef ad
    
    select @sql = @sql + 'from auxDef ad' + char(13)
    + 'inner join auxFields af on af.fieldNumber = ad.fieldNumber' + char(13)
    + 'group by af.pageId'
    
    exec(@sql)
    

    【讨论】:

      猜你喜欢
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 2013-02-09
      相关资源
      最近更新 更多