SQL 服务器数组或动态字段标题或数据透视表

SQL Server Array or dynamic field headings or pivot

我正在使用 SQL Server 2012,不确定解决问题的最佳方法。这是我的数据:

Item   Size   SortOrder    Qty
ABC    XS      1            0
ABC    S       2            8
ABC    M       3            4
ABC    L       4            3
ZXY    1       1            10
DEF    6       1            5
DEF    8       2            4
DEF    10      3            7
DEF    12      4            6
QWE    1       1            5

但是,我需要以网格格式呈现,并且大小需要随着标题动态变化:

ABC   XS   S   M   L
Qty   0    8   4   3
ZXY   1
Qty   10
DEF   6    8   10   12
Qty   5    4   7     6
QWE   1
Qty   5

我还需要将数量分配给适当的大小,并且大小必须始终按照排序顺序从左到右显示。

最好的方法是什么?创建数组还是可以在数据透视表中实现上述目标?

谢谢。

我尝试使用以下方法进行数据透视,但一直收到错误“无效的列名 'Item':

DECLARE @SizeColums VARCHAR(MAX)
SELECT  @SizeColums = COALESCE(@SizeColums + ',','') + QUOTENAME([Size])
FROM    vw_SizeSeq 
GROUP BY [Size]

DECLARE @Sql NVARCHAR(MAX) = N'
    SELECT  Item,
            [Types],' +
            @SizeColums + '
    FROM    (SELECT * FROM vw_SizeSeq 
    ) t
    UNPIVOT ( 
         [Type]
        FOR [Types] IN ([Item])) up
    PIVOT (
        MAX([Type])
        FOR [Size] IN (' + @SizeColums + ')
    ) p
'

EXEC sp_executesql @sql;

不太好,但我认为这可能有用

Declare @XML xml = (Select Item,Size,SortOrder,Qty=isnull(Qty,0) from YourTable for XML RAW),@SQL varchar(max) = ''

-- Create SQL for columns
Select @SQL = @SQL+',Col'+cast(SortOrder as varchar(25))+' = max(case when ColNr='+cast(SortOrder as varchar(25))+' then Value else '''' end)'+char(13)
 From  (Select Distinct SortOrder From YourTable) A Order by SortOrder

-- Normalize Data
Select Itm      = r.value('@Item','varchar(25)')
      ,ColNr     = r.value('@SortOrder','int')
      ,Attribute = attr.value('local-name(.)','varchar(100)')
      ,Value     = attr.value('.','varchar(max)')
 Into  #Temp
 From  @XML.nodes('/row') as A(r)
 Cross Apply A.r.nodes('./@*') AS B(attr)
 Where attr.value('local-name(.)','varchar(100)') not in ('Item','SortOrder')

-- Create Final SQL and Execute
Set @SQL = 'Select Item=case when Attribute=''Qty'' then '''' else Itm end'+@SQL+' From #Temp Group By Itm,Attribute Order By Itm,Attribute Desc'
Exec(@SQL)

Returns

Item    Col1    Col2    Col3    Col4
ABC     XS      S       M       L
        0       8       4       3
DEF     6       8       10      12
        5       4       7       6
QWE     1           
        5           
ZXY     1           
        10