Суммируйте два самых низких значения из записи - PullRequest
2 голосов
/ 26 мая 2019

У меня есть такая таблица:

enter image description here

Мне нужно сложить два самых низких значения для каждой записи. Например, в первом ряду 2 и 4 (2 + 4 = 6).

Я могу найти самое низкое значение для каждой строки, используя CROSS APPLY, но я не могу найти два самых низких значения одновременно, чтобы их суммировать.

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 26 мая 2019

Я бы сделал это как:

select id, sumval - maxval
from t cross apply
     (select sum(val) as sumval, max(val) as maxval
      from values (value1), (value2), (value3)) v(val)
     ) v;

Если у вас есть три элемента, сумма наименьших двух - это сумма всех их минус самый большой.

В общем, я бы использовал что-то вроде этого:

select id, sum2
from t cross apply
     (select sum(val) as sum2
      from (select top (2) val
            from values (value1), (value2), (value3) v(val)
            order by val asc
           ) v
     ) v
0 голосов
/ 27 мая 2019

Исходные данные:

DECLARE @Table TABLE (ID INT IDENTITY(1,1),Value1 INT, Value2 INT, Value3 INT);
INSERT INTO @Table (Value1,Value2,Value3) VALUES
     (2,4,5)
    ,(3,7,2)
    ,(9,1,6)
;

код:

SELECT a.ID,SUM(a.[Value]) AS [Sum]
FROM (
    SELECT p.ID,p.Value
        ,ROW_NUMBER()OVER(PARTITION BY p.ID ORDER BY p.Value ASC) AS [rn]
    FROM @Table t
    UNPIVOT(Value FOR Param IN ([Value1],[Value2],[Value3])) p
) a
WHERE a.rn <= 2 /*pick up only two lowest*/
GROUP BY a.ID
;
0 голосов
/ 26 мая 2019
SELECT 
 IIF (VALUE1 < VALUE3 AND VALUE2 < VALUE3, 
       VALUE1 + VALUE2,
       IIF(VALUE1 < VALUE2 AND VALUE3 < VALUE2, 
        VALUE1 + VALUE3, 
        IIF(VALUE3 < VALUE1 AND VALUE2 < VALUE1, 
         VALUE2 + VALUE3, 0)))

- Вам нужно будет решить, что делать, если не выполнено ни одно из условий: я установил результат на ноль.Это становится громоздким, если вы добавите больше столбцов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...