首页 / SQL Server / 正文

[SQL Server]SQL Server是否有同时按两个字段查找最大值的函数?

7519 发布于: 2018-02-10 读完约需6分钟

问题描述

如题,在SQL Server中,是否存在一个函数,可以按两个字段查询最大值,比如这样的查询语句:

SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o

我们知道,在SQL Server中是有内置的MAX()函数,但这个内置的MAX()函数是用于返回一列中的最大值。NULL 值不包括在计算中,但它只是针对一个字段进行处理。

提示:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。

现在,要求按两个字段查找最大值,在SQL Server中,我们又可以如何实现呢?

方案一

SQL Server中,如需实现按两个字段查找最大值,我们可以使用用户自定义函数:User-Defined Function,用户自定义函数的写法类似如下:

create function dbo.InlineMax(@val1 int, @val2 int)
returns int
as
begin
  if @val1 > @val2
    return @val1
  return isnull(@val2,@val1)
end

调用方法:

SELECT o.OrderId, dbo.InlineMax(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o

方案二

如果是SQL Server 2008或者以上版本,我们也可以不要自定义函数 而,直接使用如下这个解决方案:

SELECT o.OrderId,
       (SELECT MAX(Price)
        FROM (VALUES (o.NegotiatedPrice),(o.SuggestedPrice)) AS AllPrices(Price))
FROM Order o

方案三

使用SQL ServerCASE WHEN语句也可以实现同样的效果,如:

SELECT
  o.OrderId,
  CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN o.NegotiatedPrice 
     ELSE o.SuggestedPrice
  END
FROM Order o

方案四

如果我们在SQL Server 2012或者以上版本中,我们也可以使用IIF函数,如:

IIF(a>b,a,b)

具体的示例如:

SELECT 
    o.OrderId, 
    IIF( ISNULL( o.NegotiatedPrice, 0 ) > ISNULL( o.SuggestedPrice, 0 ),
         o.NegotiatedPrice, 
         o.SuggestedPrice 
    )
FROM 
    Order o

方案五

DECLARE @MAX INT
@MAX = (SELECT MAX(VALUE) 
               FROM (SELECT 1 AS VALUE UNION 
                     SELECT 2 AS VALUE) AS T1)

方案六

如果在CASE WHEN语句中,还需要考虑NULL值的话,这样解决会更好:

SELECT o.OrderId, 
   CASE WHEN ISNULL(o.NegotiatedPrice, o.SuggestedPrice) > ISNULL(o.SuggestedPrice, o.NegotiatedPrice)
        THEN ISNULL(o.NegotiatedPrice, o.SuggestedPrice)
        ELSE ISNULL(o.SuggestedPrice, o.NegotiatedPrice)
   END
FROM Order o

方案七

使用子查询来实现:

;WITH [Order] AS
(
SELECT 1 AS OrderId, 100 AS NegotiatedPrice, 110 AS SuggestedPrice UNION ALL
SELECT 2 AS OrderId, 1000 AS NegotiatedPrice, 50 AS SuggestedPrice
)
SELECT
       o.OrderId, 
       (SELECT MAX(price)FROM 
           (SELECT o.NegotiatedPrice AS price 
            UNION ALL SELECT o.SuggestedPrice) d) 
        AS MaxPrice 
FROM  [Order]  o

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [C#].NET/C#程序开发中如何复制整个文件夹中的内容(包括文件和子文件夹)?

下一篇: [SQL Server]SQL Server中如何从一个数据表中删除某列?

本文永久链接码友网 » [SQL Server]SQL Server是否有同时按两个字段查找最大值的函数?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册