Найти значение на основе пересечения между строкой и столбцом - PullRequest
0 голосов
/ 24 июня 2019

У меня есть две таблицы (извините, я не знаю, как форматировать таблицу здесь):

Первый (расчетные значения):

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 (на пересечении 1-й строки и 1-го столбца) Для контракта 198381 результат должен быть 0,85 и так далее. Я могу сделать это с помощью CASE для каждого значения в RD, но если мне когда-нибудь понадобится изменить коэффициенты из второй таблицы, это займет много времени и я могу ошибиться.

Результат должен выглядеть следующим образом

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 месяцев.

1 Ответ

0 голосов
/ 24 июня 2019

Когда данные в одной таблице ссылаются на имена схем в другой, вы можете использовать динамический 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...