我在SQL Server 2012中使用SQL查询。
我有一张包含以下数据的表格:
ID headervalue details
-----------------------------
1 zero testzero
2 testzero1
3 Test testtest1
4 First testfirst1
5 testfirst2
6 testfirst3
7 testfirst4
8 Second testSecond1
我需要输出如下:
ID headervalue details
1 zero testzero
2 zero testzero1
3 Test testtest1
4 First testfirst1
5 First testfirst2
6 First testfirst3
7 First testfirst4
8 Second testSecond1
如何用现有值替换空格?
有人可以帮忙吗?
答案 0 :(得分:1)
使用CROSS APPLY:
测试数据:
DECLARE @t TABLE
(ID int, headervalue varchar(10), details varchar(30))
INSERT @t VALUES
(1, 'zero', 'testzero'),
(2, '', 'testzero1'),
(3, 'Test', 'testtest1'),
(4, 'First', 'testfirst1'),
(5, '', 'testfirst2'),
(6, '', 'testfirst3'),
(7, '', 'testfirst4'),
(8, 'Second', 'testSecond1')
查询:
SELECT t.id, x.headervalue, t.details
FROM @t t
CROSS APPLY
(
SELECT top 1
headervalue
FROM @t
WHERE
headervalue <> ''
and id <= t.id
ORDER BY id DESC) x
结果:
id headervalue details
1 zero testzero
2 zero testzero1
3 Test testtest1
4 First testfirst1
5 First testfirst2
6 First testfirst3
7 First testfirst4
8 Second testSecond1
答案 1 :(得分:1)
您可以使用窗口功能执行此操作:
SELECT ID, MAX(headervalue) OVER (PARTITION BY grp), details
FROM (
SELECT ID, headervalue, details,
SUM(CASE WHEN headervalue <> '' THEN 1 ELSE 0 END) OVER (ORDER BY ID) AS grp
FROM mytable ) AS t
上面使用的子查询,即
SELECT ID, headervalue, details,
SUM(CASE WHEN headervalue <> '' THEN 1 ELSE 0 END) OVER (ORDER BY ID) AS grp
FROM mytable
产生以下输出:
ID headervalue details grp
--------------------------------
1 zero testzero 1
2 testzero1 1
3 Test testtest1 2
4 First testfirst1 3
5 testfirst2 3
6 testfirst3 3
7 testfirst4 3
8 Second testSecond1 4
因此,grp
可帮助我们识别“即将命名的相同”headervalue
条记录的组。将MAX
应用于这些记录片段可为headervalue
每grp
个切片提供预期结果。