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

时间:2019-06-24 14:49:00

标签: sql-server ssms

我有两个表(对不起,我在这里不知道如何格式化表):

第一个(计算值):

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个月之间。

1 个答案:

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