使用group by动态转换行到列

时间:2017-04-27 08:12:12

标签: sql-server group-by transpose

我正在寻找一个可以使用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的每个单独列都有数字的增量,这应该是动态的。

3 个答案:

答案 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