代码之家  ›  专栏  ›  技术社区  ›  lesscode

t-sql中的聚合最大

  •  2
  • lesscode  · 技术社区  · 16 年前

    我的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中没有最大的函数的情况下,我可以用这个得到两列中较大的一列:

    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中,这在不使用过程/临时表的情况下是可能的吗?

    更新:Eran,谢谢-我用了这个方法。不过,我的最后一个表达式有点复杂,我想知道在这种情况下的性能:

    SUM(CASE WHEN ABS(column1 * column2) > ABS(column3 * column4)
             THEN column5 * ABS(column1 * column2) * column6
             ELSE column5 * ABS(column3 * column4) * column6 END)
    
    7 回复  |  直到 11 年前
        1
  •  11
  •   James Curran    16 年前

    试试这个:

     SELECT SUM(CASE WHEN column1 > column2 
                     THEN column1 
                     ELSE column2 END) 
     FROM test
    
        2
  •  1
  •   StingyJack    16 年前

    试试这个…这不是最好的选择,但应该有效。

    SELECT
      'LargerValue' = CASE 
                       WHEN SUM(c1) >= SUM(c2) THEN SUM(c1)
                       ELSE SUM(c2)
                      END
    FROM Test
    
        3
  •  1
  •   changelog    16 年前
    SELECT
        SUM(MaximumValue)
    FROM (
        SELECT 
            CASE WHEN column1 > column2
            THEN
                column1
            ELSE
                column2
            END AS MaximumValue
        FROM
            Test
    ) A
        4
  •  0
  •   Sean Reilly    16 年前

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

        5
  •  0
  •   Alex K.    13 年前

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

     -- 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
    
        6
  •  0
  •   takrl cck    13 年前
    select sum(id) from (
        select (select max(c)
            from (select column1 as c
                    union all
                    select column2) as cs) id
      from test
    )
    
        7
  •  0
  •   Dominic Goulet    11 年前

    最好的答案就是:

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

    它比具有两个以上值列的其他答案具有更好的伸缩性。