我在编写填写空白值的查询时遇到问题。我知道这听起来很混乱,所以让我演示和解释。
说我有一个查询“Select Table,Serial,TrackNum From Table1”,结果如下:
表1
Name Serial TrackNum
AAA
AAA 222 T1
BBB 333 T1
BBB 444 T2
BBB 555
BBB 666
CCC 777 T3
CCC 888
CCC 999
DDD 998
EEE 997 T4
EEE 996
FFF T5
我遇到问题,形成一个查询以生成下面的结果。您看到Serial#555和666从上面的行继承了“T2”,对于Serial#888和999也是如此。但是,部分#DDD有序列但没有跟踪#。并且FFF没有连续但跟踪#。
Name Serial TrackNum
AAA
AAA 222 T1
BBB 333 T1
BBB 444 T2
BBB 555 T2
BBB 666 T2
CCC 777 T3
CCC 888 T3
CCC 999 T3
DDD 998
EEE 997 T4
EEE 996 T4
FFF T5
如果您提供示例代码,请提供帮助和表示感谢。
答案 0 :(得分:1)
这会满足您的需求吗?对此技术的警告是,AAA
的第一行也会显示T1
的{{1}}而不是空字符串/ TrackNum
。
NULL
如果你想DECLARE @Table1 TABLE (Name VARCHAR(3),Serial VARCHAR(3),TrackNum VARCHAR(3))
INSERT @Table1
VALUES ('AAA','','')
,('AAA','222','T1')
,('BBB','333','T1')
,('BBB','444','T2')
,('BBB','555','')
,('BBB','666','')
,('CCC','777','T3')
,('CCC','888','')
,('CCC','999','')
;WITH c AS (SELECT Name,
MAX(TrackNum) AS TrackNum
FROM @Table1
GROUP BY Name)
SELECT t.Name, t.Serial, CASE
WHEN t.TrackNum IS NULL OR t.TrackNum = ''
THEN CASE
WHEN t.Serial IS NULL OR t.Serial = ''
THEN ''
ELSE c.TrackNum
END
ELSE t.TrackNum
END AS TrackNum
FROM @Table1 t
JOIN c ON t.Name = c.Name
任何事情可以给你一个想法。
UPDATE
答案 1 :(得分:0)
假设这些是NULL
值:
SELECT Name, Serial,
CAST(
SUBSTRING(
MAX( CAST(Name AS BINARY(4)) + CAST(Serial AS BINARY(4)) )
OVER( ORDER BY Name
ROWS UNBOUNDED PRECEDING ),
5, 4)
AS varchar(5)) AS TrackNum
FROM table
由Ben-Gan先生提供,http://sqlmag.com/t-sql/last-non-null-puzzle