我有一个我需要在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或更高版本的任何新功能。
答案 0 :(得分:0)
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;
如果您需要在列之间获得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