根据行和列之间的交集查找值

Find value based on intersection between row and column

我有两个table(抱歉,我不知道如何格式化table):

第一个(计算值):

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 and AGE=60TO71 获得值 0,5(在第 1 行和第 1 列的交叉点) 对于合约 198381,结果应为 0,85 等等。 我可以用 CASE 为 RD 中的每个值做到这一点,但如果我需要从第二个 table 开始更改系数,那将花费很多时间,而且我可能会出错。

结果应该是这样的

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% 之间并且 AGE 12TO23 表示 12 到 23 个月之间。

当一个 table 中的数据引用另一个中的模式名称时,您可以使用动态 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

Returns:

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')