如何在SQL中复制MIN和MAX

时间:2017-12-12 14:15:20

标签: sql-server max min

我有一个我需要在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或更高版本的任何新功能。

2 个答案:

答案 0 :(得分:0)

SQL Server中的

MINMAX不能使用分隔列表;它们获得跨数据集的表达式的最小/最大值。因此,没有SELECT MIN(ColumnA, ColumnB, ColumnC);这样的功能,而是你有类似的东西:

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

如果您需要在列之间获得MAXIMUM,那么是的,您需要使用CASE表达式。使用您的数据和一些giuess工作,结果如下:

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。我没有在这里找到一个解决方案,因为我们只有常量可以使用,而且我不想猜测答案。

答案 1 :(得分:0)

尝试使用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