我需要创建一个表(可能是一个视图)来关联两个表,一个配置表和一个结果表。问题是必须在配置表的多行中转换结果表中的一个简单行。
我将举例说明我的需求:
配置表:主键=(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的方法,但我试图避免它。希望你能帮帮我。
提前致谢。
答案 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
您仍然必须识别受影响的所有暗淡列,但您只需要执行一次,而不是两次。如果删除或重命名任何暗淡列,这也会抛出错误,尽管它不会从新的暗淡列填充。不确定是否有任何办法。