Мой SQL ржавый - у меня есть простое требование вычислить сумму большего из двух значений столбца:
CREATE TABLE [dbo].[Test]
(
column1 int NOT NULL,
column2 int NOT NULL
);
insert into Test (column1, column2) values (2,3)
insert into Test (column1, column2) values (6,3)
insert into Test (column1, column2) values (4,6)
insert into Test (column1, column2) values (9,1)
insert into Test (column1, column2) values (5,8)
В отсутствие функции GREATEST в SQL Server я могу получить больший из двух столбцов следующим образом:
select column1, column2, (select max(c)
from (select column1 as c
union all
select column2) as cs) Greatest
from test
И я надеялся, что смогу просто суммировать их так:
select sum((select max(c)
from (select column1 as c
union all
select column2) as cs))
from test
Но без кубиков:
Msg 130, Level 15, State 1, Line 7
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
Возможно ли это в T-SQL без обращения к таблице процедур / времени?
ОБНОВЛЕНИЕ: Эран, спасибо - я использовал этот подход. Однако мое последнее выражение немного сложнее, и меня интересует производительность в этом случае:
SUM(CASE WHEN ABS(column1 * column2) > ABS(column3 * column4)
THEN column5 * ABS(column1 * column2) * column6
ELSE column5 * ABS(column3 * column4) * column6 END)
Я знаю, что ответ @Eran идеально подходит для ваших текущих потребностей, но я предлагаю вам взглянуть на мой ответ, поскольку это лучшая замена GREATEST.





Попробуйте это ... Это не самый эффективный вариант, но должен работать.
SELECT
'LargerValue' = CASE
WHEN SUM(c1) >= SUM(c2) THEN SUM(c1)
ELSE SUM(c2)
END
FROM Test
Это дает мне ответ 26 для тестовых данных выше - должно быть 32
Мне не нужна большая сумма из двух столбцов, мне нужна сумма большей из двух столбцов.
Вам нужна «сумма больших значений столбца для каждой строки»
Попробуй это:
SELECT SUM(CASE WHEN column1 > column2
THEN column1
ELSE column2 END)
FROM test
Это становится очень трудно читать с более чем двумя столбцами значений, но для OP это, вероятно, лучше всего.
SELECT
SUM(MaximumValue)
FROM (
SELECT
CASE WHEN column1 > column2
THEN
column1
ELSE
column2
END AS MaximumValue
FROM
Test
) AК вашему сведению, более сложный случай подойдет, если все эти столбцы являются частью одной таблицы. Он по-прежнему ищет то же количество строк, поэтому производительность должна быть очень похожа на более простой случай (поскольку производительность SQL Server обычно ограничивается вводом-выводом).
Как найти максимум из однострочных данных
-- eg (empid , data1,data2,data3 )
select emplid , max(tmp.a)
from
(select emplid,date1 from table
union
select emplid,date2 from table
union
select emplid,date3 from table
) tmp , table
where tmp.emplid = table.emplid
select sum(id) from (
select (select max(c)
from (select column1 as c
union all
select column2) as cs) id
from test
)
Лучший ответ на это просто:
;With Greatest_CTE As
(
Select ( Select Max(ValueField) From ( Values (column1), (column2) ) ValueTable(ValueField) ) Greatest
From Test
)
Select Sum(Greatest)
From Greatest_CTE
Он масштабируется намного лучше, чем другие ответы с более чем двумя столбцами значений.
Упростите так: SUM (column5 * column6 * CASE WHEN ABS (column1 * column2)> ABS (column3 * column4) THEN ABS (column1 * column2) ELSE ABS (column3 * column4) END)