我做了一个unpivot,结果是,在使用row_number()
进行unpivot之后添加了row_number。
Name ID Label Value Row_Number
A 101 Label1 11 1
A 101 Label2 20 2
A 101 Label3 16 3
B 102 Label1 17 1
B 102 Label2 19 2
B 102 Label3 12 3
B 102 Label4 17 4
C 103 Label1 15 1
C 103 Label2 16 2
我需要一些帮助来删除row_number为1的整行,并且只将Label
和Value
列值添加到新列。可能结果如下表所示。
Name ID Label Value Row_Number New Label New Value
A 101 Label2 20 2 Label1 11
A 101 Label3 16 3
B 102 Label2 19 2 Label1 17
B 102 Label3 12 3
B 102 Label4 17 4
C 103 Label2 16 2 Label1 15
我想这样做,将row_number> = 2的所有记录存储到临时表中。并将row_number = 1的所有值存储到另一个临时表中。并使用Name
和ID
加入数据。
与此同时,我认为这不是一种强有力的做法,任何建议都会帮助我,无论我是想要这个解决方案,还是有其他更好的方法。
提前致谢。
答案 0 :(得分:1)
按照CTE而不是临时表执行你所说的话
WITH cte1 AS (
SELECT Name, ID, Label, Value
FROM <<Table>>
WHERE Row_Number = 1
), cte2 AS (
SELECT Name, ID, Label, Value, Row_Number
FROM <<Table>>
WHERE Row_Number > 1
)
SELECT
cte2.Name, cte2.ID, cte2.Label, cte2.Row_Number,
cte1.Label AS New_Label, cte1.Value AS New_Value
FROM
cte1 LEFT JOIN cte2 ON cte1.ID =cte2.ID AND cte2.Row_Number=2
答案 1 :(得分:0)
你问题中的输入数据真的不是虚拟的吗?
如果是,
将Case
语句与Sub-query
一起使用,如下一个演示: -
Create table #temp (Name char(1),ID int, Label varchar(10), Value int,Row_Number int)
go
insert into #temp values('A',101,'Label1', 11,1)
insert into #temp values('A',101,'Label2', 20,2)
insert into #temp values('A',101,'Label3', 16,3)
insert into #temp values('B',102,'Label1', 17,1)
insert into #temp values('B',102,'Label2', 19,2)
insert into #temp values('B',102,'Label3', 12,3)
insert into #temp values('B',102,'Label4', 17,4)
insert into #temp values('C',103,'Label1', 15,1)
insert into #temp values('C',103,'Label2', 16,2)
go
select Name,ID,Label,value,Row_Number , [New Label] , [New value]
from (
select Name,ID,Label,value,Row_Number,
case Label when 'Label2' then 'Label1' end as [New Label],
case Label when 'Label2' then (select value from #temp
where name = b.Name
and Label = 'Label1'
) end as [New value]
from #temp b
) a
where Label <> 'Label1'
<强>结果: - 强>