Aggregate GREATEST в T-SQL

Мой 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)

Упростите так: SUM (column5 * column6 * CASE WHEN ABS (column1 * column2)> ABS (column3 * column4) THEN ABS (column1 * column2) ELSE ABS (column3 * column4) END)

ErikE 04.02.2010 04:39

Я знаю, что ответ @Eran идеально подходит для ваших текущих потребностей, но я предлагаю вам взглянуть на мой ответ, поскольку это лучшая замена GREATEST.

Dominic Goulet 27.03.2013 23:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
5 875
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Попробуйте это ... Это не самый эффективный вариант, но должен работать.

SELECT
  'LargerValue' = CASE 
                   WHEN SUM(c1) >= SUM(c2) THEN SUM(c1)
                   ELSE SUM(c2)
                  END
FROM Test

Это дает мне ответ 26 для тестовых данных выше - должно быть 32

lesscode 28.10.2008 16:36

Мне не нужна большая сумма из двух столбцов, мне нужна сумма большей из двух столбцов.

lesscode 28.10.2008 16:50

Вам нужна «сумма больших значений столбца для каждой строки»

StingyJack 29.10.2008 22:47
Ответ принят как подходящий

Попробуй это:

 SELECT SUM(CASE WHEN column1 > column2 
                 THEN column1 
                 ELSE column2 END) 
 FROM test

Это становится очень трудно читать с более чем двумя столбцами значений, но для OP это, вероятно, лучше всего.

Dominic Goulet 27.03.2013 23:36
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

Он масштабируется намного лучше, чем другие ответы с более чем двумя столбцами значений.

Другие вопросы по теме