Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 将行转换为表_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 将行转换为表

Sql server 2008 将行转换为表,sql-server-2008,tsql,Sql Server 2008,Tsql,我需要创建一个表(可能是一个视图),该表关联两个表,一个配置表和一个结果表。问题是有必要将结果表中的一个简单行转换为configs表的多行 我会给你一个我需要的例子: 配置表:主键=(id\u文件,cpattr) 结果表 id_file dim01 dim02 dim03 ------------------------------------------------------- f01 01 88 015 f02 99 0.78

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

我会给你一个我需要的例子:

配置表:主键=(id\u文件,cpattr)

结果表

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的方法,但我正试图避免它。希望你能帮助我


提前感谢。

由于您的结果表中似乎只有三个dim列,因此最简单的方法是案例陈述:

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
编辑以添加:

由于dim列的数量不确定,因此更好的方法可能是:

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

您仍然需要识别所有受影响的dim列,但只需识别一次,而不是两次。如果删除或重命名任何dim列,这也会引发错误,尽管它不会从新dim列填充。我不知道怎么做。

谢谢。您的解决方案解决了我的问题,尽管我没有3个dim,但加上50,这可能会使代码有点低效。目前,我有第一个解决方案工作得很好,尽管我没有大量的数据。当我有真实的数据时,我将测试两种解决方案,以选择最佳解决方案。谢谢!:)
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