我正在寻找一个可以使用group by转换行到列的代码,下面是我的表和欲望输出。
表格
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 :(得分: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()
答案 1 :(得分: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 强>
答案 2 :(得分:0)
试试这个,
declare @table table(Name Varchar(100), groupid int)
...
declare @int1 int
set @int1 = 0
while @int1 < 10
begin
select name from @table WHERE groupid = @int1
set @int1 = @int1 + 1
end