2016-10-04 77 views
-2

我正在使用SQL Server 2012并且不确定是否处理问题的最佳方式。这是我的数据:SQL Server阵列或动态字段标题或数据透视表

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 

此外,我需要分配数量,以适当的大小并且尺寸必须始终按排序顺序从左到右显示。

什么将是最好的方法?创建数组还是我可以在枢轴上实现上述?

谢谢。

我尝试使用下面的转动,但保持收到错误“无效列名‘项目’:

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; 
+0

在SQL中,我们只能以表格格式生成结果,但您的预期结果看起来有所不同。尝试应用层为这个 –

+0

他们必须是一种方式枢轴和unpivot – Michael

+0

可能是不理解您的预期结果格式。你能否让它更清晰 –

回答

0

不漂亮,但我想也许这可能工作

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'[email protected]+' From #Temp Group By Itm,Attribute Order By Itm,Attribute Desc' 
Exec(@SQL) 

返回

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   
+0

感谢您的。我没有得到相同的结果 - 我得到的项目是正确的左边的项目,然后所有可能的排序顺序号码作为列标题 - 我需要这些是项目大小。 – Michael

+0

不可以。每个项目可以有不同的尺寸范围。在顶部的原始数据中,项目ABC的大小为XS \ S \ M \ L,DEF的大小为6 \ 8 \ 10 \ 12 ZXY仅在大小1中,QWE仅在大小1中。这些都需要动态列标题 – Michael

+0

4行是,加上大小下的数量。我只想显示尺寸,如果该项目的尺寸存在,虽然像我的原始文章的第二部分的结果 – Michael