Ich habe zwei Variablen, eine heißt PaidThisMonth
und die andere heißt OwedPast
. Sie sind beide Ergebnisse einiger Unterabfragen in SQL. Wie kann ich den kleineren der beiden auswählen und ihn als Wert mit dem Titel zurückgeben PaidForPast
?
Die MIN
Funktion arbeitet mit Spalten, nicht mit Variablen.
tsql
sql-server
Malfist
quelle
quelle
Antworten:
Anwendungsfall:
Als Inline-Tabelle bewertet UDF
Verwendung:
ADDENDUM: Dies ist wahrscheinlich am besten geeignet, wenn nur zwei mögliche Werte angesprochen werden. Wenn mehr als zwei vorhanden sind, sollten Sie die Antwort von Craig mithilfe der Values-Klausel berücksichtigen .
quelle
SQL Server 2012 und 2014 unterstützen die IIF-Funktion (cont, true, false). Somit können Sie es für eine minimale Auswahl wie verwenden
Während IIF nur eine Abkürzung zum Schreiben ist
CASE...WHEN...ELSE
, ist es einfacher zu schreiben.quelle
IIF
ist nur ein syntaktischer Zucker fürCASE...WHEN...ELSE
.Die Lösungen mit CASE, IIF und UDF sind angemessen, aber unpraktisch, wenn das Problem mit mehr als 2 Vergleichswerten auf den allgemeinen Fall ausgedehnt wird. Die verallgemeinerte Lösung in SQL Server 2008+ verwendet eine seltsame Anwendung der VALUES-Klausel:
Gutschrift aufgrund dieser Website: http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/20/use-values-clause-to-get-the-maximum-value-from-some-columns-sql- server-t-sql.aspx
quelle
MIN(x*(case x when 0 then null else 1 end))
Ich hatte gerade eine Situation, in der ich maximal 4 komplexe Auswahlen innerhalb eines Updates finden musste. Mit diesem Ansatz können Sie so viele haben, wie Sie möchten!
Sie können die Zahlen auch durch zusätzliche Auswahlen ersetzen
Komplexere Verwendung
Ich bin sicher, dass eine UDF eine bessere Leistung hat.
quelle
Für MySQL oder PostgreSQL 9.3+ ist es besser, die Funktionen
LEAST
und zuGREATEST
verwenden.Mit:
GREATEST(value [, ...])
: Gibt den größten zurück Argument (maximaler Wert) aus den angegebenen Werten zurückLEAST(value [, ...])
Gibt das kleinste (minimalwertige) Argument aus den angegebenen Werten zurückDokumentationslinks:
quelle
Hier ist ein Trick, wenn Sie das Maximum berechnen möchten (Feld, 0):
Gibt 0 zurück, wenn dies
field
negativ ist. Andernfalls wird zurückgegebenfield
.quelle
SELECT @a - ( ABS(@a-@b) + (@a-@b) ) / 2
Verwenden Sie eine CASE-Anweisung.
Beispiel B auf dieser Seite sollte genau dem entsprechen, was Sie versuchen:
http://msdn.microsoft.com/en-us/library/ms181765.aspx
Hier ist der Code von der Seite:
quelle
Verwenden Sie eine temporäre Tabelle, um den Wertebereich einzufügen, und wählen Sie dann das Min / Max der temporären Tabelle aus einer gespeicherten Prozedur oder UDF aus. Dies ist ein grundlegendes Konstrukt. Sie können es also nach Bedarf überarbeiten.
Beispielsweise:
quelle
Dies funktioniert für bis zu 5 Daten und behandelt Nullen. Ich konnte es einfach nicht als Inline-Funktion zum Laufen bringen.
quelle
Aufbauend auf der brillanten Logik / dem Code von Mathematix und Scottyc reiche ich ein:
Obwohl der Sprung von der MIN-Funktion von Scottyc zur MAX-Funktion für mich offensichtlich gewesen sein sollte, war dies nicht der Fall. Deshalb habe ich ihn gelöst und hier eingefügt: SELECT @a + (ABS (@ b- @ a) + ( @ b- @ a)) / 2. Die zufällig generierten Zahlen sind zwar kein Beweis, sollten aber zumindest Skeptiker davon überzeugen, dass beide Formeln korrekt sind.
quelle