2017-04-27 32 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)在'MAX)')之後你錯過了'AS columnName'' 3)動態方法無法知道已聲明的表變量超出範圍... – Shnugo

+0

@ Shnugo,Thank.i忘記了在動態SQL你不使用表變量。這是唯一的錯誤。第二,毫無疑問,我複製了你的SQL的一部分。 – KumarHarsh

+0

@KumarHarsh,我面對Order by(由rn命令)和標量變量錯誤爲'@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

你可以在這裏PLZ糾正我的動態SQL? – 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

我得到這三個錯誤。 1)「不能將默認值分配給局部變量。」 2)「必須聲明標量變量」@Prefix「」,以及3)「關鍵字'order'附近的語法不正確。」 – Jayank