In SQL Server 2012 oder höher können Sie eine Kombination aus IIF
y ISNULL
(oder COALESCE
), um das Maximum von 2 Werten zu erhalten.
Auch wenn 1 von ihnen NULL ist.
IIF(col1 >= col2, col1, ISNULL(col2, col1))
Oder wenn Sie wollen, dass es 0 zurückgibt, wenn beide NULL sind
IIF(col1 >= col2, col1, COALESCE(col2, col1, 0))
Beispiel Ausschnitt:
-- use table variable for testing purposes
declare @Order table
(
OrderId int primary key identity(1,1),
NegotiatedPrice decimal(10,2),
SuggestedPrice decimal(10,2)
);
-- Sample data
insert into @Order (NegotiatedPrice, SuggestedPrice) values
(0, 1),
(2, 1),
(3, null),
(null, 4);
-- Query
SELECT
o.OrderId, o.NegotiatedPrice, o.SuggestedPrice,
IIF(o.NegotiatedPrice >= o.SuggestedPrice, o.NegotiatedPrice, ISNULL(o.SuggestedPrice, o.NegotiatedPrice)) AS MaxPrice
FROM @Order o
Ergebnis:
OrderId NegotiatedPrice SuggestedPrice MaxPrice
1 0,00 1,00 1,00
2 2,00 1,00 2,00
3 3,00 NULL 3,00
4 NULL 4,00 4,00
Aber wenn man das Maximum von mehreren Spalten braucht?
Dann schlage ich eine CROSS APPLY auf eine Aggregation der VALUES vor.
Exemple :
SELECT t.*
, ca.[Maximum]
, ca.[Minimum], ca.[Total], ca.[Average]
FROM SomeTable t
CROSS APPLY (
SELECT
MAX(v.col) AS [Maximum],
MIN(v.col) AS [Minimum],
SUM(v.col) AS [Total],
AVG(v.col) AS [Average]
FROM (VALUES (t.Col1), (t.Col2), (t.Col3), (t.Col4)) v(col)
) ca
Dies hat den zusätzlichen Vorteil, dass gleichzeitig auch andere Dinge berechnet werden können.
26 Stimmen
Das ist in den meisten anderen Datenbanken als
GREATEST
Funktion; SQLite emuliert die Unterstützung, indem es mehrere Spalten in derMAX
Aggregat.8 Stimmen
Mögliches Duplikat von stackoverflow.com/questions/71022/sql-max-of-multiple-columns
1 Stimmen
Bei der Suche nach einer Lösung für max(a, b) unten sollten Sie sich die Frage stellen, ob die Syntax oder die Berechnung für "a" und/oder "b" wiederholt werden soll. D.h. wenn "b" aus einer komplexen Berechnung mit viel Syntax abgeleitet wird, dann bevorzugen Sie vielleicht eine Lösung, bei der "b" nur einmal erscheint. Z.B. bedeutet die Lösung "IIF(a>b, a, b)" die Wiederholung von "b" - was syntaktisch hässlich sein könnte, aber die folgende Lösung bedeutet, dass "b" (und "a") nur einmal erscheint: SELECT MAX(WERT) FROM (SELECT a AS VALUE UNION SELECT b AS VALUE) AS T1
0 Stimmen
Weiterverfolgung von OMG Ponys ' ein guter Rat, in dem DBMS, das ich benutze, ist die Funktion
GREATER
stattGREATEST
. Schauen Sie also in der Hilfe Ihres DBMS nach. Wenn Sie das eine nicht finden, versuchen Sie das andere oder etwas Ähnliches.