Как суммировать столбцы в одной строке? SQL Server - PullRequest
0 голосов
/ 03 октября 2019

У меня есть таблица, подобная приведенной ниже:

id      pymt_no1     pymt_no2      pymt_no3    pymt_no4     pymt_amt1     pymt_amt2       pymt_amt3    pymt_amt4
25      100          5             150           50             60           70            80              90

Как работает таблица, pymt_no1 соответствует pymt_amt1 и т. Д ...

То, что я пытаюсь сделать, это подвести итогистолбцы pymt_amt, основанные на операторе CASE, где pymt_no находится в диапазоне значений.

Например, я пытаюсь получить общее значение pymt_amt, где любое из значений pymt_no находится в диапазоне от 100 до 150. Так что в этом случае для приведенной выше таблицы только значения pymt_no1 и pymt_no3 имеют значение от 100 до 150,поэтому мне нужно суммировать pymt_amt, который соответствует ему, поэтому итоговое значение здесь будет 140.

Я пробовал запрос ниже, но моя проблема в том, что он тянет только первый pymt_amt, а не остальныедля меня, чтобы сложить вместе:

with pymt as (
SELECT 
    id,
    CASE
        WHEN pymt_no1 BETWEEN 100 and 150 THEN pymt_amt01
        WHEN pymt_no2 BETWEEN 100 and 150 THEN pymt_amt02
        WHEN pymt_no3 BETWEEN 100 and 150 THEN pymt_amt03
        WHEN pymt_no4 BETWEEN 100 and 150 THEN pymt_amt04
        END AS [Amount]
FROM pymt
)


SELECT 
    id,
    SUM(Total) as [Total]
FROM pymt
GROUP BY id

Моя мысль, стоящая за этим процессом для примера выше, была, например, в cte, чтобы он выглядел примерно так:

id     Amount
25       60
25       80  

Изатем, сохранив это в cte, я мог бы суммировать столбец Amount и группировать его по столбцу id, чтобы получить правильную сумму.

Любая помощь с этим очень ценится.

Ответы [ 3 ]

1 голос
/ 03 октября 2019

Вам необходимо добавить регистр для каждого столбца

--Sample table and Data 
CREATE TABLE #temp (
    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 #temp (   id ,
                  pymt_no1 ,
                  pymt_no2 ,
                  pymt_no3 ,
                  pymt_no4 ,
                  pymt_amt1 ,
                  pymt_amt2 ,
                  pymt_amt3 ,
                  pymt_amt4
              )
 VALUES (   25 , -- id - int
       100 , -- pymt_no1 - int
       5 , -- pymt_no2 - int
       150 , -- pymt_no3 - int
       50 , -- pymt_no4 - int
       60 , -- pymt_amt1 - int
       70 , -- pymt_amt2 - int
       80 , -- pymt_amt3 - int
       90   -- pymt_amt4 - int
   )



--Solution
with pymt as (
SELECT 
id,
 CASE  WHEN pymt_no1 BETWEEN 100 and 150 THEN pymt_amt1 ELSE 0 END AS AmOUNT1 ,
 CASE  WHEN pymt_no2 BETWEEN 100 and 150 THEN pymt_amt2  ELSE 0 END AS AmOUNT2 ,
 CASE  WHEN pymt_no3 BETWEEN 100 and 150 THEN pymt_amt3  ELSE 0 END AS Amount3 ,
 CASE  WHEN pymt_no4 BETWEEN 100 and 150 THEN pymt_amt4  ELSE 0 END AS Amount4 

 FROM #temp
 )


SELECT 
  id,
  SUM([Amount1] + pymt.AmOUNT2 + pymt.Amount3 + pymt.Amount4) as [Total]
 FROM pymt
 GROUP BY id
1 голос
/ 03 октября 2019

Другой способ:

select id,
    sum(
    (case when pymt_no1 between 100 and 150 then pymt_no1 else 0 end) +
    (case when pymt_no2 between 100 and 150 then pymt_no2 else 0 end) +
    (case when pymt_no3 between 100 and 150 then pymt_no3 else 0 end) +
    (case when pymt_no4 between 100 and 150 then pymt_no4 else 0 end)
    )
from pymt
group by id
1 голос
/ 03 октября 2019

Одним из способов обслуживания этого запроса является использование серии запросов объединения для каждой пары столбцов. Если ваши данные соответствуют размеру столбца выборки, то это довольно быстрый способ достижения результата. Затем вы можете обернуть ваш запрос внешним запросом, который суммирует ваши значения

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