使用动态描述旋转多个字段

时间:2018-03-08 21:37:59

标签: sql sql-server sql-server-2008

我试图调整以下内容,但我不知道为什么我很难搞清楚这一点。

数据脚本

create table #data (ID varchar(50)
, nm varchar(50)
, val decimal(18,2)
)

insert into #data values (1,'Name1', 100.00),
(1,'Name2', 200.00),
(2,'Name3', 300.00),
(2,'Name4', 400.00),
(2,'Name5', 500.00),
(3,'Name6', 600.00),
(4,'Name7', 700.00),
(4,'Name8', 800.00),
(5,'Name9', 900.00)

通缉结果作为SQL Server中的表

1   Name1   100 Name2   200     
2   Name3   300 Name4   400 Name5   500   
3   Name6   600             
4   Name7   700 Name8   800     
5   Name9   900             

更新 以下提供两个字段的结果,但我真正想要的是名称和值都存在于不同的列中,而不是一个,

SELECT  id,
(
    SELECT nm,val 
    FROM #data
    WHERE  id = d.id
    ORDER BY id FOR XML PATH('')
) 
FROM #data d
WHERE 
    id IS NOT NULL
GROUP BY id;

1 个答案:

答案 0 :(得分:0)

这是“pivot”而不是聚合字符串连接的示例。 SQL查询的一个问题是您需要指定要返回的确切列。因此,对于返回的列,这不是动态的。

以下内容每nm

最多返回三个值
select id,
       max(case when seqnum = 1 then nm end) as nm_1,
       max(case when seqnum = 1 then val end) as val_1,
       max(case when seqnum = 2 then nm end) as nm_2,
       max(case when seqnum = 2 then val end) as val_2,
       max(case when seqnum = 3 then nm end) as nm_3,
       max(case when seqnum = 3 then val end) as val_3
from (select d.*,
             row_number() over (partition by id order by (select null)) as seqnum
      from #data d
     ) d
group by id;

请注意,您可能希望按插入顺序排列列。如果是这样,您需要指定一个包含排序的列。我建议将表定义为:

create table #data (
    dataId int identity(1, 1,) primary key,
    ID varchar(50),
    nm varchar(50),
    val decimal(18,2)
);