2016-09-15 8 views
3

にピボット文字列値する必要があります値を持つ私はテーブルのように説明しているSQLサーバー

Occupation String | 
Name String 

Developer | A 
Developer | B 
Designer | X 
Coder  | Y 
Coder  | Z 

私はピボット形式で値を必要とするよう:

Designer | Developer | Coder 
---------+-----------+-------- 
    X  |  A  | Y 
    Null |  B  | Z 

ことができます誰かがこれに助けますか?事前

+0

ZはBにバインドされており、デザイナーはいないが、YはXとAにバインドされていることをデータがどのように知っていますか? – Shnugo

+0

私は、(演算文字列で区切られた)値を順序付けし、結果をピボットするために行番号関数を使用したいと思うでしょう... – ZLK

+0

この関係はありません..データはアルファベット順にソートされました..ピボット後 –

答えて

2

おかげROW_NUMBERとの基本的なPIVOTは()あなたのために物事を行います。

SELECT [Developer], 
     [Designer], 
     [Coder] 
FROM (
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY (SELECT NULL)) RN 
    FROM #temp 
) as t 
PIVOT (
    MAX(Name) FOR Occupation IN ([Developer],[Designer],[Coder]) 
) as pvt 

出力:

Developer Designer Coder 
A   X   Y 
B   NULL  Z 

Occupation Sの数が非常に、あなた可能性がある場合動的SQLが必要:

DECLARE @columns nvarchar(max), 
     @sql nvarchar(max) 

SELECT @columns = (
    SELECT DISTINCT ','+QUOTENAME(Occupation) 
    FROM #temp 
    FOR XML PATH('') 
) 

SELECT @sql = N' 
SELECT '+STUFF(@columns,1,1,'')+' 
FROM (
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY (SELECT NULL)) RN 
    FROM #temp 
) as t 
PIVOT (
    MAX(Name) FOR Occupation IN ('+STUFF(@columns,1,1,'')+') 
) as pvt' 

EXEC sp_executesql @sql 

注:私はORDER BY (SELECT NULL)を使用してランダムな順序を取得しました。この目的のためにいくつかの実際のフィールドを使います。

+0

'ROW_NUMBER()OVER(PARTITION BY占有ORDER BY(SELECT NULL))'は何らかの順序を定義しますが、これは予測できません。私は、たとえそれが働いていても、このアプローチがそうであると言っています! - 何もしてはならないことです... – Shnugo

+0

'(SELECT NULL)'の代わりに@Shnugo OPは、彼が必要としているフィールドを使用できます。これは単なる例です。個人的に私は並べ替えのためのフィールドを持っていない場合、私はそのような順序を使用して、これは私たち(会社)のDBのまれなものです。 – gofr1

+0

ありがとうございました。私はそれに時間を投資した.. :( –

関連する問題