Одним из способов обслуживания этого запроса является использование серии запросов объединения для каждой пары столбцов. Если ваши данные соответствуют размеру столбца выборки, то это довольно быстрый способ достижения результата. Затем вы можете обернуть ваш запрос внешним запросом, который суммирует ваши значения
declare @pymt table (id int, pymt_no1 int, pymt_no2 int, pymt_no3 int, pymt_no4 int, pymt_amt1 int, pymt_amt2 int, pymt_amt3 int, pymt_amt4 int);
insert @pymt (
id , pymt_no1 , pymt_no2 , pymt_no3 , pymt_no4 , pymt_amt1 , pymt_amt2 , pymt_amt3 , pymt_amt4)
values
(25 , 100 , 5 , 150 , 50 , 60 , 70 , 80 , 90);
select sum(amount_to_sum) from (
select pymt_no1, pymt_amt1 as amount_to_sum from @pymt where pymt_no1 between 100 and 150
union
select pymt_no2, pymt_amt2 from @pymt where pymt_no2 between 100 and 150
union
select pymt_no3, pymt_amt3 from @pymt where pymt_no3 between 100 and 150
union
select pymt_no4, pymt_amt4 from @pymt where pymt_no4 between 100 and 150) x;
Если вы действительно хотите сделать это как CTE, вы можете сделать это следующим образом:
declare @pymt table (id int, pymt_no1 int, pymt_no2 int, pymt_no3 int, pymt_no4 int, pymt_amt1 int, pymt_amt2 int, pymt_amt3 int, pymt_amt4 int);
insert @pymt (
id , pymt_no1 , pymt_no2 , pymt_no3 , pymt_no4 , pymt_amt1 , pymt_amt2 , pymt_amt3 , pymt_amt4)
values
(25 , 100 , 5 , 150 , 50 , 60 , 70 , 80 , 90);
with pymt as (
select pymt_no1, pymt_amt1 as amount_to_sum from @pymt where pymt_no1 between 100 and 150
union
select pymt_no2, pymt_amt2 from @pymt where pymt_no2 between 100 and 150
union
select pymt_no3, pymt_amt3 from @pymt where pymt_no3 between 100 and 150
union
select pymt_no4, pymt_amt4 from @pymt where pymt_no4 between 100 and 150)
select sum(amount_to_sum) from pymt;