2017-12-12 5 views
0

Ich habe eine Excel-Formel, die ich in SQL neu erstellen müssen: = MIN (150,0.75 * MAX (100-0-0/0.9,0))Wie MIN und MAX in SQL replizieren

Es mit verschachteltem Fall Aussagen gemacht werden, aber ich ein Programm bin mit SQL zu generieren, die zur Zeit dies nicht unterstützt:

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 

gibt es eine andere Möglichkeit, dies zu tun, ohne eine gespeicherte Prozedur erstellen?

Hinweis: Ich kann ab SQL Server 2012 keine neuen Funktionen mehr verwenden.

+1

Warum würden Sie tun so etwas mit Konstanten zu benutzen? – Fleury26

+0

Dies ist ein Beispiel, die Konstanten sind eigentlich Unterabfragen, aber die Abfrage sieht sehr verwirrend aus. –

+0

"Ich verwende ein Programm, um SQL zu generieren" - fügen Sie der Frage den Namen hinzu. – svgrafov

Antwort

0

MIN und MAX in SQL Server funktionieren nicht mit einer Liste mit Trennzeichen; Sie erhalten den minimalen/maximalen Wert für einen Ausdruck in einem Datensatz. Somit gibt es keine solche Funktionalität als SELECT MIN(ColumnA, ColumnB, ColumnC);, anstatt Sie so etwas wie haben würde:

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

Wenn Sie die maximale zwischen den Spalten bekommen müssen, dann ja, müssen Sie einen CASE Ausdruck verwenden. Verwenden Sie Ihre Daten, und ein bisschen giuess Arbeit, ergibt sich so etwas wie:

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; 

Die andere Alternative wäre Ihre Daten zu schwenken, und die MAX/MIN auf diese Weise erhalten. Ich habe hier jedoch keine Lösung für diese Frage geschrieben, da wir nur Konstanten haben, mit denen wir arbeiten können, und ich möchte keine Antwort erraten.

0

Versuchen Subqueries mit 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 

Und diese Abfrage mit Variablen

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