SQL - 有关重新排列数据的帮助

时间:2017-01-10 10:36:54

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

我做了一个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的整行,并且只将LabelValue列值添加到新列。可能结果如下表所示。

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的所有值存储到另一个临时表中。并使用NameID加入数据。

与此同时,我认为这不是一种强有力的做法,任何建议都会帮助我,无论我是想要这个解决方案,还是有其他更好的方法。

提前致谢。

2 个答案:

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

<强>结果: -

enter image description here