我想改变这样的表:
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。
答案 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