2016-10-04 6 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

彼らはピボットとピボットを解除する方法でなければなりません – 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行はい、プラスサイズの下の数量。私は元の投稿の2番目の部分の結果のようにアイテムのサイズが存在する場合はサイズを表示したいだけです – Michael

関連する問題