2017-04-27 1 views
-2

グループを使用して行を列に転記できるコードを探しています。以下は私の表と希望出力です。グループを使用して行を列に動的に変換する

表:

MR_ID | DR_ID 
--------|-------- 
MR_123 | 1 
MR_123 | 3 
MR_124 | 4 
MR_124 | 5 
MR_124 | 6 
MR_125 | 0 

欲望出力:ここに

MR_ID | DR_ID_1 | DR_ID_2 | DR_ID_3 
--------|----------|----------|--------- 
MR_123 |  1 | 2  | NULL 
MR_124 |  4 | 5  | 6 
MR_125 |  0 | NULL | NULL 

私はこれが動的である必要があり、数の増加と各DR_IDための各別々の列をしたいです。

答えて

0

create table #tmp (MR_ID varchar(50),DR_ID int) 
insert into #tmp VALUES 
('MR_123', 1),('MR_123', 3),('MR_124', 4),('MR_124', 5) 
,('MR_124', 6),('MR_125', 0) 

declare @DRCol varchar(50) 
declare @Prefix varchar(20)='DR_' 
;With CTE as 
(
select * 
,ROW_NUMBER()over(partition by MR_ID order by DR_ID)rn 
from #tmp 
) 

select top 1 
@DRCol=stuff((select ','+'['[email protected]+cast(rn as varchar)+']' 
from cte c1 where c.mr_id=c1.mr_id for xml path('')),1,1,'') 
from cte c 
where c.mr_id=(select top 1 mr_id from cte c1 order by rn desc) 


declare @Sql varchar(2000)='' 

set @Sql=' SELECT p.* 
FROM 
(
    SELECT * 
      ,'''[email protected]+'''+ cast(ROW_NUMBER() OVER(PARTITION BY MR_ID ORDER BY DR_ID) as varchar(max)) columnName 
    FROM #tmp AS m 
    ) AS t 
PIVOT(MAX(DR_ID) FOR columnName IN('[email protected]+')) AS p' 
print @sql 
exec(@sql) 
drop table #tmp 
+0

1) '(CAST(ROW_NUMBER)。2)の前に' + 'がありません。') ')') 'の後に' AS columnName'がありません。3)動的アプローチでは、スコープ外です... – Shnugo

+0

@ Shnugo、ありがとうございました。動的SQLでは忘れていましたが、テーブル変数を使用していません。これは唯一間違いです.2番目の疑問はあなたのSQLの一部をコピーしました。 – KumarHarsh

+0

@KumarHarsh、私はorder by rnでエラーに直面し、スカラー変数errorは '@Perfix' – Jayank

0

このようにそれを試してみてください。

DECLARE @mockup TABLE(MR_ID VARCHAR(10),DR_ID INT); 
INSERT INTO @mockup VALUES 
('MR_123',1) 
,('MR_123',3) 
,('MR_124',4) 
,('MR_124',5) 
,('MR_124',6) 
,('MR_125',0); 

SELECT p.* 
FROM 
(
    SELECT * 
      ,'DR_ID_' + CAST(ROW_NUMBER() OVER(PARTITION BY MR_ID ORDER BY DR_ID) AS VARCHAR(MAX)) AS columnName 
    FROM @mockup AS m 
) AS t 
PIVOT(MAX(DR_ID) FOR columnName IN(DR_ID_1,DR_ID_2,DR_ID_3,DR_ID_4)) AS p; 

「動的な列名が」ROW_NUMBER()

+0

はあなたがここに私の動的SQLを修正plzはできますか?、これを試してみてください – KumarHarsh

0

を使用して作成されます。また、動的SQLクエリを使用することができます。

クエリ

declare @sql as varchar(max); 
select @sql = 'select t.MR_ID, ' + stuff((
    select distinct ', max(case t.[rn] when ' 
    + cast(t.[rn] as varchar(10)) + ' then t.[DR_ID] end) 
    [DR_ID' + cast(t.[rn] as varchar(10)) + ']' 
    from (
     select [rn] = row_number() 
     over(partition by MR_ID order by DR_ID), * 
     from your_table_name 
    )t 
    for xml path('') 
), 1, 2, '') 
+ ' from (select [rn] = row_number() over(partition by MR_ID order by DR_ID), * 
    from your_table_name)t 
    group by t.[MR_ID];'; 

exec(@sql); 

Find a demo here

+0

こんにちはUllasさんからのお返事ありがとうございました。 – Jayank

+0

このコードは、38個以上のDR_IDで動作していません。 – Jayank

+0

これら3つのエラーが発生しています。 1) "ローカル変数にデフォルト値を割り当てることはできません。" 2) "スカラー変数" @Prefix "を宣言しなければならない、3)"キーワード 'order'の近くに構文が正しくない。 " – Jayank

関連する問題