我正在尝试将表数据导出为excel格式。
我目前的观点的选择查询会给出这样的结果..
IDs Column_A Column_B Column_C Column_D Column_E
1 EDC RFV TGB UJM 14789
2 EDC RFV TGB UJM 22225
但我希望得到这样的结果......
IDs Column_A Column_B Column_C Column_D Column_E
1 EDC RFV TGB UJM 14789
2 22225
那么如何实现这个目标呢?
答案 0 :(得分:4)
评论太长了。
不要在SQL中执行此操作。事实上,我甚至认为这在Excel中不是一个好主意。通过删除值,您将无法执行过滤列值或创建数据透视表等操作。
你可以在SQL中执行此操作。一种简单的方法使用lag()
:
select . . .,
(case when lag(column_a) over (order by id) = column_a then NULL
else column_a
end) as column_a,
. . .
但仅仅因为你能做到并不意味着你应该这样做。
答案 1 :(得分:1)
这是一个用于SQL 2008的方法,使用ROW_NUMBER()
和一些分区而不是LAG
。请注意,如果您有权使用2012 +。{/ p>,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列表。