将行转换为表

时间:2012-01-16 15:41:30

标签: sql-server-2008 tsql

我需要创建一个表(可能是一个视图)来关联两个表,一个配置表和一个结果表。问题是必须在配置表的多行中转换结果表中的一个简单行。

我将举例说明我的需求:

配置表:主键=(id_file,cpattr)

id_file     cpattr      type
------------------------------------
f01         dim01       merchant_id
f01         dim02       card_number
f01         dim03       trans_code
f02         dim01       card_number
f02         dim02       amount

结果表

id_file dim01   dim02   dim03
-------------------------------------------------------
f01      01      88      015
f02      99     0.78    null

我希望得到一个包含以下输出的表格(视图):

id_file type            data
--------------------------------------------------
f01     merchant_id     01
f01     card_number     88
f01     trans_code      015
f02     card_numer      99
f02     amount          0.78 

我没有看到没有使用动态sql的方法,但我试图避免它。希望你能帮帮我。

提前致谢。

1 个答案:

答案 0 :(得分:2)

因为看起来你的结果表中只有三个暗淡的列,所以最简单的就是一个case语句:

select 
    c.id_file
    , [type]
    , case c.cpattr
        when 'dim01' then r.dim01
        when 'dim02' then r.dim02
        when 'dim03' then r.dim03
        else ''
    end [data]
from 
    configs c
    left join results r
        on c.id_file = r.id_file

已编辑添加:

由于存在不确定数量的暗淡列,因此可能采用稍微好一点的方法:

select
    c.id_file, c.type, o.data
from 
    _configs c
    left join 
    (
        select * from _results
        unpivot
        (
            [data] for cpattr in (dim01, dim02, dim03, ...)
        ) as [output]
    ) as [o]
        on c.id_file = o.id_file
        and c.cpattr = o.cpattr

您仍然必须识别受影响的所有暗淡列,但您只需要执行一次,而不是两次。如果删除或重命名任何暗淡列,这也会抛出错误,尽管它不会从新的暗淡列填充。不确定是否有任何办法。