这是用于 SQL 2008 的方法,使用带有某些分区的 ROW_NUMBER() 而不是 LAG。请注意,如果您可以访问 2012+,LAG 解决方案应该更有效(且可读性更强)。
DECLARE @tbl TABLE (IDs int,Column_A char(3), Column_B char(3), Column_C char(3),Column_D char(3),Column_E int)
insert @tbl
VALUES
(1,'EDC','RFV','TGB','UJM',14789)
,(2,'EDC','RFV','TGB','UJM',22225)
,(3,'EDC','RFV','TGB','UJM',22222)
,(4,'ECD','RFV','TGB','UJM',22222)
select IDs
,(case when ROW_NUMBER() over (PARTITION BY Column_A order by ids) <> 1 then NULL
else column_a
end) as column_a
,(case when ROW_NUMBER() over (PARTITION BY Column_B order by ids) <> 1 then NULL
else column_B
end) as column_b
,(case when ROW_NUMBER() over (PARTITION BY Column_C order by ids) <> 1 then NULL
else column_c
end) as column_c
,(case when ROW_NUMBER() over (PARTITION BY Column_D order by ids) <> 1 then NULL
else column_D
end) as column_D
,Column_E
FROM @tbl
输入:
1 EDC RFV TGB UJM 14789
2 EDC RFV TGB UJM 22225
3 EDC RFV TGB UJM 22222
4 ECD RFV TGB UJM 22222
输出:
1 EDC RFV TGB UJM 14789
2 NULL NULL NULL NULL 22225
3 NULL NULL NULL NULL 22222
4 ECD NULL NULL NULL 22222
但同样,这可能会导致比它解决的问题更多的问题。我会考虑对数据进行透视/反透视或以其他方式重新排列数据是否更有意义,也许是为了有效地显示每个 Column_A/B/C/D 的 ID 列表。