我有两个表(对不起,我在这里不知道如何格式化表):
第一个(计算值):
Contract RD AGE
=================================
194306 A0TO30 60TO71
196797 A50TO70 60TO71
197206 A50TO70 60TO71
198381 A70TO90 60TO71
198419 A150TO200 60TO71
229896 A0TO30 12TO23
41009438 A70TO90 12TO23
41009448 A0TO30 12TO23
第二个(固定值)
Interval 12TO23 24TO35 36TO47 48TO59 60TO71 72TO83
============================================================================
A0TO30 0,85 0,75 0,65 0,55 0,5 0,45
A30TO50 0,87 0,8 0,75 0,7 0,65 0,6
A50TO70 0,9 0,85 0,8 0,75 0,7 0,65
A70TO90 1 0,95 0,9 0,85 0,85 0,85
A90TO150 1,2 1,15 1,1 1,05 1,05 1,05
A150TO200 1,3 1,25 1,2 1,15 1,1 1,1
我需要的是例如对于合同194306 RD = A0TO30和AGE = 60TO71 获得值0,5(在第一行和第一列的交点处) 对于合同198381,结果应为0,85,依此类推。 对于RD中的每个值,我都可以使用CASE来完成,但是如果我需要更改第二张表中的系数,则将花费大量时间,并且我可能会犯错误。
结果应该像这样
Contract Coefficient
====================
194306 0,5
196797 0,7
197206 0,7
198381 0,85
198419 1,1
我什么也没尝试,因为坦率地说,我不知道从哪里开始。 我用
这样的CASE做到了CASE WHEN RD BETWEEN 0 and 30 THEN
CASE WHEN AGE BETWEEN 12 and 23 THEN 0,85
WHEN AGE BETWEEN 24 and 35 THEN 0,75
...,以此类推,对于RD中的每个间隔
对于RD,“ A0TO30”实际上表示RD在0%到30%之间,并且 年龄12TO23意味着12到23个月之间。
答案 0 :(得分:0)
当一个表中的数据引用另一个表中的模式名称时,可以使用动态SQL编写查询并使用sp_executesql执行该查询:
DECLARE @sql NVARCHAR(MAX)
SELECT @sql = (
SELECT STUFF(
(SELECT ' UNION ALL SELECT ' + CAST(Contract AS VARCHAR(25)) + ' AS Contract, ' +
'(SELECT ' + QUOTENAME(AGE) + ' FROM t2 WHERE Interval = t1.RD) AS Coefficient ' +
'FROM t1 WHERE contract = ' + CAST(Contract AS VARCHAR(25))
FROM t1
FOR XML PATH('')), 1, 11, '')
)
EXEC Sp_executesql @sql
返回:
Contract Coefficient
194306 0,5
196797 0,7
197206 0,7
198381 0,85
198419 1,1
229896 0,85
41009438 1
41009448 0,85
(样本数据)
CREATE TABLE t1 (Contract INT, RD VARCHAR(25), AGE VARCHAR(25))
INSERT INTO t1 VALUES
(194306 ,'A0TO30' ,'60TO71'),
(196797 ,'A50TO70' ,'60TO71'),
(197206 ,'A50TO70' ,'60TO71'),
(198381 ,'A70TO90' ,'60TO71'),
(198419 ,'A150TO200' ,'60TO71'),
(229896 ,'A0TO30' ,'12TO23'),
(41009438 ,'A70TO90' ,'12TO23'),
(41009448 ,'A0TO30' ,'12TO23')
CREATE TABLE t2 (Interval VARCHAR(25), [12TO23] varchar(10), [24TO35] varchar(10), [36TO47] varchar(10), [48TO59] varchar(10), [60TO71] varchar(10), [72TO33] varchar(10))
INSERT INTO t2 VALUES
('A0TO30' ,'0,85','0,75','0,65','0,55','0,5','0,45'),
('A30TO50' ,'0,87','0,8', '0,75','0,7','0,65','0,6'),
('A50TO70' ,'0,9' ,'0,85','0,8','0,75','0,7','0,65'),
('A70TO90' ,'1' ,'0,95','0,9','0,85','0,85','0,85'),
('A90TO150' ,'1,2' ,'1,15','1,1','1,05','1,05','1,05'),
('A150TO200','1,3' ,'1,25','1,2','1,15','1,1','1,1')