SQL - 创建具有重复值的新列

时间:2018-05-17 13:47:46

标签: sql sql-server tsql pivot

我想改变这样的表:

ID  Value
1   A
1   B
2   C
2   A
3   D

对此:

ID  Value1  Value2
1   A       B
2   C       A
3   D       

这只是示例表,但显示了我需要做的事情。实际上我有1669行的表。有1500个不同的ID和84个不同的值。问题是一个ID可以有很少的选项。我想轻松使用表来更改/添加值,然后再将其导回到sql。

3 个答案:

答案 0 :(得分:1)

您想要条件聚合:

select ID,
       max(case when Seq = 1 then value end) [value1],
       max(case when Seq = 2 then value end) [value2]
from(select *,
       row_number() over (partition by ID order by Value) Seq
     from table 
    )t
group by ID;

答案 1 :(得分:0)

试试这个

;WITH CTE(ID, Value)
AS
(
SELECT 1,'A' UNION ALL
SELECT 1,'B' UNION ALL
SELECT 2,'C' UNION ALL
SELECT 2,'A' UNION ALL
SELECT 3,'D' 
)

SELECT Id,
      Value1=ISNULL(CAST('<S>'+REPLACE(Value,',','</S><S>')+'</S>'  AS XML ).value('/S[1]','varchar(max)'),''),
      Value2=ISNULL(CAST('<S>'+REPLACE(Value,',','</S><S>')+'</S>'  AS XML ).value('/S[2]','varchar(max)'),'')
FROM
(
SELECT DISTINCT ID, STUFF((SELECT ', '+Value FROM CTE i WHERE i.ID=o.ID 
FOR XML PATH ('')),1,1,'') AS Value
FROM CTE o
)dt

结果演示:http://rextester.com/RGU24096

Id  Value1  Value2
------------------
1    A       B
2    C       A
3    D  

答案 2 :(得分:0)

可以使用任意数量的重复ID

declare @t table (id int, val char(1));
insert into @t values
    (1, 'A')
  , (1, 'B')
  , (2, 'C')
  , (2, 'A')
  , (3, 'D')
  , (4, 'a')
  , (4, 'b')
  , (4, 'c')
  , (4, 'd')
  , (4, 'e');
  select t.id, t.val1, t.val2
  from  ( select t.id, t.val as val1
               , lead(t.val) over  (partition by id order by val) as val2
               , ROW_NUMBER() over (partition by id order by val) as rn 
            from @t t
        ) t
  where rn % 2 = 1
  order by id, val1