Microsoft SQL Server 2012 将恰好相邻两行的数据合并为一行

Microsoft SQL Server 2012 merge data of exactly two adjacent rows into one row

#master 的当前状态 table:

我一直在尝试制定一个 SELECT 查询,通过选择恰好两个相邻行的值列然后将其放在两列中的一行中来实现以下目标。

目前我的解决方案:

克隆主控table。

  1. Select 第一行来自 master 的值 table.

  2. 然后加入 master table 和 Id 上的克隆并从 +1 递增的 id 中选择值...

  3. 跳过 master 的下一个 Id

  4. 重复步骤 1-3 直到 master 结束 table

     select *
    into #clone
    from #master
    
    
    Select Value AS Value1 from #master
           Value AS Value2 from #clone  
    inner join #clone
      ON #master.Id /*(incremented id)*/ = #clone.Id /*(incremented id)*/
    -- skip the next id of #master```
    
    
    

坚持递增并跳过#master 的下一个 id 部分 table...

用于创建 table 并插入一些值

create table mastertable
(
id int,
Name varchar(20),
ParentID int,
Value varchar(50)
)

insert into mastertable values(86, 'Description1',83,'021541-sds2-45515')
insert into mastertable values(87, 'value1',83, '7.56')
insert into mastertable values(90, 'Description3',83, '021541-sds2-45567')
insert into mastertable values(91,'value3',83, '.72')
insert into mastertable values(94, 'Description5',83, '021541-sd72-47715')
insert into mastertable values(95,'value5',83, '.11')

现在,试试这个查询:

with m1 as
(
SELECT *, RN = ROW_NUMBER() OVER (order by id) FROM mastertable
),
m2 as
(
SELECT *, RN = ROW_NUMBER() OVER (order by id) FROM mastertable
)

SELECT m1.id, m1.name, m1.parentid, m1.value as value1, m2.value as value2
FROM  m1 left join  m2
ON m1.RN = m2.RN-1
WHERE  m1.RN%2 != 0

编辑: 对于 m2,除了 SELECT *,您还可以使用:

m2 as
(
SELECT id,value, RN = ROW_NUMBER() OVER (order by id) FROM mastertable
)