2017-12-12 15 views
0

내가 SQL에 다시 작성해야 엑셀 공식이 있습니다 = MIN (150,0.75 * MAX (100-0-0/0.9,0))SQL에서 MIN과 MAX를 복제하는 방법

그것을 중첩 된 경우 문을 수행 할 수 있습니다,하지만 난 현재이 기능을 지원하지 않는 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 이후의 새로운 기능을 사용할 수 없습니다.

+1

왜 상수 그런 일을 할 것이 쿼리? – Fleury26

+0

이 예제는 상수가 실제로 하위 쿼리이지만 쿼리가 매우 혼란스럽게 보입니다. –

+0

"SQL을 생성하는 프로그램을 사용하고 있습니다"- 질문에 이름을 추가하십시오. – svgrafov

답변

0

MINMAX은 구분 된 목록과 함께 작동하지 않습니다. 그들은 데이터 집합 전체의 표현식에 대한 최소값/최대 값을 얻습니다. 따라서, 대신 당신은 같은 거라고, SELECT MIN(ColumnA, ColumnB, ColumnC); 같은 그런 기능이 없다 : 당신은 열 사이의 최대를 얻기 위해 필요한 경우

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

를 다음 네, 당신은 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 그 방법을 얻을 것입니다. 나는 여기에 해결책을 게시하지 않았지만, 우리는 단지 상수를 가지고 있기 때문에 대답을 추측하고 싶지는 않습니다.

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