2016-12-07 4 views
0

こんにちは、私は私が上のピボット機能を使用したいと思います次のテーブルがあります。ピボット:タテデータへ

Id|Number| Code 
1 | 34 |abc12345 
1 | 23 |xqwe6758 
2 | 37 |ghut564hg 
3 | 456 |ghut8695 
3 | 39 |ghtuj678 
3 | 22 |fsdifje12 

をそして、私はそれが次のように水平に表示させたい:

Id| Code1 | Code2 | Code3 
1 | abc12345 | xqwe6758 | null 
2 |ghut564hg | null  | null 
3 |ghut8695 | ghtuj678 | fsdifje12 


SELECT Id 
     ,[Code1] 
     ,[Code2] 
     ,[Code3] 
    FROM(SELECT Id,Code 
     FROM [TableName] 
)d 
    pivot(
    max(Id) 
    for Code in([Code1],[Code2],[Code3]) 
)as piv; 

これは、Id列に無効な列名エラーをスローします。誰かがエラーを特定するのに役立つでしょうか?

+0

@DanielCorzo:私はコードの欄には非常にランダムな値を持っているので、私はそのリンクで述べたように「ケース」の値をハードコードにしたくありません。回避策はありますか? – user7221204

+0

最大3つのコードには制限がありますか? – Shnugo

+0

@ Shnugo:はいIdごとに最大3つのコードがあります – user7221204

答えて

2

あなたは以下のようにピボットを使用することができます:あなたは、列のリストを作成し、さまざまな列に実行するために、動的SQLを使用するものを使用することができ、様々な列の場合

;with cte as 
(
    select 
     id, code, 
     RowN = Row_Number() over (partition by id order by code) 
    from 
     yourtable1 
) 
select * 
from cte 
pivot (max(code) for RowN in([1], [2], [3])) p 

を...しかし、それはでは様々な例で使用可能ですSO自体...

は私の出力を追加しました:

enter image description here

+0

ID番号1の1行ではなく、別の行のコード2をコード内で分割します。 – user7221204

+0

これは必須の出力儀ですか?必要な出力を明確にしていただけますか? –

+0

同じ行は異なる列を持つ同じ行を意味しますか?それはこのクエリが与えるものです –

0

はこの

をお試しください
DECLARE @tbl TABLE(Id INT, Code VARCHAR(100)); 
INSERT INTO @tbl VALUES 
(1,'abc12345') 
,(1,'xqwe6758') 
,(2,'ghut564hg') 
,(3,'ghut8695') 
,(3,'ghtuj678') 
,(3,'fsdifje12'); 

SELECT p.* 
FROM 
(
    SELECT Id 
      ,'Code' + CAST(ROW_NUMBER() OVER(PARTITION BY Id ORDER BY Code) AS VARCHAR(10)) AS ColumnName 
      ,Code 
    FROM @tbl 
) AS t 
PIVOT 
(
    MAX(Code) FOR ColumnName IN(Code1,Code2,Code3 /*add as many as you need*/) 
) AS p 

結果

Id Code1  Code2  Code3 
1 abc12345 xqwe6758 NULL 
2 ghut564hg NULL  NULL 
3 fsdifje12 ghtuj678 ghut8695