将ID转换为列名,并将NULL替换为上一个已知值

时间:2010-03-04 19:26:17

标签: sql sql-server tsql sql-server-2008

TABLE_A

Rev     ChangedBy
-----------------------------
1       A
2       B
3       C

TABLE_B

Rev Words      ID
----------------------------
1 description_1   52
1 history_1         54
2 description_2   52
3 history_2         54

单词列数据类型为ntext。

TABLE_C

ID Name
-----------------------------
52 Description
54 History

输出

Rev ChangedBy Description        History  
------------------------------------------------
1     A   description_1      history_1
2     B   description_2      history_1
3     C   description_2      history_2

描述和历史记录列将具有先前已知的值,如果它们没有该Rev号的值。即自从Rev No。 3描述在TABLE_B中没有条目,因此最后一个已知值description_2出现在Rev no的那一列中。输出中有3个。

1 个答案:

答案 0 :(得分:0)

在以下帖子的帮助下 PIVOT on Common Table Expression
SQL QUERY replace NULL value in a row with a value from the previous known value

我能够提出以下查询以获得所需的输出。

    ;WITH CTE_A AS
    (
        SELECT a.Rev, a.ChangedBy, CAST(b.Words as nvarchar(max)) as [Words],c.Name FROM Table_A AS a
        INNER JOIN Table_B AS b ON a.Rev = b.Rev
        INNER JOIN Table_C AS c ON b.FId = c.Id
    ),
    CTE_B AS
    (

    select Rev, ChangedBy, [Description], [History] from
    CTE_A
    PIVOT
    (
        MAX([Words])
        FOR [Name] in ([Description],[History])
    ) as p
    )

select Rev,ChangedBy, 
ISNULL([Description],(select top 1 [Description] from CTE_B where Rev < t.Rev and [Description] is not null order by Rev desc)),
ISNULL([History],(select top 1 [History] from CTE_B where Rev < t.Rev and [History] is not null order by Rev desc))  
from CTE_B t