Агрегат GREATEST в T-SQL - PullRequest
       29

Агрегат GREATEST в T-SQL

2 голосов
/ 28 октября 2008

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

Ответы [ 7 ]

11 голосов
/ 28 октября 2008

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

 SELECT SUM(CASE WHEN column1 > column2 
                 THEN column1 
                 ELSE column2 END) 
 FROM test
1 голос
/ 28 октября 2008
SELECT
    SUM(MaximumValue)
FROM (
    SELECT 
        CASE WHEN column1 > column2
        THEN
            column1
        ELSE
            column2
        END AS MaximumValue
    FROM
        Test
) A
1 голос
/ 28 октября 2008

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

SELECT
  'LargerValue' = CASE 
                   WHEN SUM(c1) >= SUM(c2) THEN SUM(c1)
                   ELSE SUM(c2)
                  END
FROM Test
0 голосов
/ 27 марта 2013

Лучший ответ на этот вопрос прост:

;With Greatest_CTE As
(
  Select ( Select Max(ValueField) From ( Values (column1), (column2) ) ValueTable(ValueField) ) Greatest
    From Test
)
Select Sum(Greatest)
  From Greatest_CTE

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

0 голосов
/ 05 ноября 2009
select sum(id) from (
    select (select max(c)
        from (select column1 as c
                union all
                select column2) as cs) id
  from test
)
0 голосов
/ 03 ноября 2009

Как найти максимум из однорядных данных

 -- 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
0 голосов
/ 12 января 2009

К вашему сведению, более сложный случай должен быть в порядке, если все эти столбцы являются частью одной таблицы. Он по-прежнему ищет то же количество строк, поэтому производительность должна быть очень похожа на более простой случай (поскольку производительность SQL Server обычно ограничивается вводом-выводом).

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