在T-SQL中聚合GREATEST

时间:2008-10-28 13:25:59

标签: tsql

我的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)

在SQL Server中没有GREATEST功能的情况下,我可以使用以下内容获得两列中较大的一行:

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 个答案:

答案 0 :(得分:11)

试试这个:

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

答案 1 :(得分:1)

试试这个......它不是性能最佳的选择,但应该有效。

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

答案 2 :(得分:1)

SELECT
    SUM(MaximumValue)
FROM (
    SELECT 
        CASE WHEN column1 > column2
        THEN
            column1
        ELSE
            column2
        END AS MaximumValue
    FROM
        Test
) A

答案 3 :(得分:0)

仅供参考,更复杂的情况应该没问题,只要所有这些列都是同一个表的一部分。它仍然查找相同数量的行,因此性能应该与更简单的情况非常相似(因为SQL Server性能通常是IO绑定的)。

答案 4 :(得分:0)

如何从单行数据中找到最大值

 -- 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

答案 5 :(得分:0)

select sum(id) from (
    select (select max(c)
        from (select column1 as c
                union all
                select column2) as cs) id
  from test
)

答案 6 :(得分:0)

最好的答案就是:

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

它比具有两个以上值列的其他答案更好地扩展。