根据行和列之间的交集查找值
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')
我有两个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')