【问题标题】:How to replicate MIN and MAX in SQL如何在 SQL 中复制 MIN 和 MAX
【发布时间】:2018-05-26 06:22:25
【问题描述】:

我有一个需要在 SQL 中重新创建的 excel 公式: =MIN(150,0.75*MAX(100-0-0/0.9,0))

可以用嵌套的case语句来完成,但是我正在使用一个程序来生成目前不支持的SQL:

select
case 
when 150 < 
    case
    when 0.75*100-0-0/0.9 < 0 
    THEN 0
    ELSE 0.75*100-0-0/0.9
    END
THEN 150
ELSE 0.75*100-0-0/0.9
END

在不创建存储过程的情况下还有其他方法吗?

请注意:我无法使用 SQL Server 2012 或更高版本的任何新功能。

【问题讨论】:

  • 你为什么要用常量做这样的事情?
  • 这是一个例子,常量实际上是子查询但是查询看起来很混乱。
  • “我正在使用程序生成 SQL” - 将其名称添加到问题中。
  • 它改变了你看待问题的方式。 T-SQL 有 MAX 和 MIN 函数,您可以查找:MIN MAX

标签: sql-server max min


【解决方案1】:

SQL Server 中的MIN 和MAX 不适用于分隔列表;他们获得跨数据集的表达式的最小值/最大值。因此,没有像 SELECT MIN(ColumnA, ColumnB, ColumnC); 这样的功能,而是你会有类似的东西:

WITH Numbers AS(
    SELECT *
    FROM (VALUES (1),(2),(3)) V(N)
)
SELECT MAX(N), MIN(N)
FROM Numbers;

如果您需要获取列之间的最大值,那么是的,您需要使用 CASE 表达式。使用您的数据,并进行一些简单的工作,结果如下:

WITH Numbers AS(
        SELECT *
        FROM (VALUES (150,0.75,100-0-0,0.9,0)) V(A,B,C,D,E))
SELECT CASE WHEN 150 > CASE WHEN C/D > E THEN C/D
                            ELSE E END THEN 150
            ELSE CASE WHEN C/D > E THEN C/D
                      ELSE E END
        END AS MaxN
FROM Numbers;

另一种选择是旋转您的数据,并以这种方式获取MAX/MIN。不过,我还没有在这里发布解决方案,因为我们只有常量可以使用,我不想猜测答案。

【讨论】:

    【解决方案2】:

    尝试使用UNION ALL的子查询

    SELECT MIN(Value)
    FROM
      (
        SELECT 150 Value
    
        UNION ALL
    
        SELECT 0.75*MAX(Value)
        FROM
          (
            SELECT 100-0-0/0.9 Value
    
            UNION ALL
    
            SELECT 0
          ) q
      ) q
    

    这个带有变量的查询

    DECLARE
      @value1 float=100-0-0/0.9,
      @value2 float=0,
      @value3 float=150
    
    SELECT MIN(Value)
    FROM
      (
        SELECT @value3 Value
    
        UNION ALL
    
        SELECT 0.75*MAX(Value)
        FROM
          (
            SELECT @value1 Value
    
            UNION ALL
    
            SELECT @value2
          ) q
      ) q
    

    【讨论】:

      猜你喜欢
      • 2017-08-06
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      相关资源
      最近更新 更多