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
我正在使用 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