SQL Server 2008 - 填充空白值

时间:2016-08-03 20:56:36

标签: sql-server

我在编写填写空白值的查询时遇到问题。我知道这听起来很混乱,所以让我演示和解释。

说我有一个查询“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        

如果您提供示例代码,请提供帮助和表示感谢。

2 个答案:

答案 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