Sql server 2008 将行转换为表
我需要创建一个表(可能是一个视图),该表关联两个表,一个配置表和一个结果表。问题是有必要将结果表中的一个简单行转换为configs表的多行 我会给你一个我需要的例子: 配置表:主键=(id\u文件,cpattr) 结果表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
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