Maximum über verschiedene Spalten einer Tabelle
Den Maximum Wert einer einzelnen Spalte zu ermitteln, ist nicht weiter schwer. Hier kann man ein einfache MAX(Spaltenname) verwenden. Was aber wenn man den Maximalwert über mehrere Spalten einer Tabelle hinweg ermitteln möchte?
...
SET NOCOUNT ON
IF OBJECT_ID('dbo.max_t') > 0
DROP TABLE dbo.max_t
GO
CREATE TABLE dbo.max_t
(
col1 int,
col2 int,
col3 int
)
INSERT INTO dbo.max_t(col1, col2, col3) VALUES(1,3,6)
INSERT INTO dbo.max_t(col1, col2, col3) VALUES(12,3,9)
INSERT INTO dbo.max_t(col1, col2, col3) VALUES(0,25,8)
INSERT INTO dbo.max_t(col1, col2, col3) VALUES(5,0,30)
SET NOCOUNT OFF
GO
SELECT
MAX(MaxSpaltenWert) AS MaxTabellenWert
FROM
(
SELECT MAX(col1) AS MaxSpaltenWert FROM dbo.max_t
UNION ALL
SELECT MAX(col2) AS MaxSpaltenWert FROM dbo.max_t
UNION ALL
SELECT MAX(col3) AS MaxSpaltenWert FROM dbo.max_t
) orig_t;
MaxTabellenWert
---------------
30
(1 row(s) affected)
Diese Lösung liefert auf jeden Fall ein korrektes Ergebnis.
Trackback-Adresse für diesen Eintrag

17.11.10 @ 09:20:18
Hi Frank,
dieses Statement ist nicht unbedingt gut lesbar, vermeidet aber einen dreifachen Table-Scan:
SELECT MAX(case when (case when col1 > col2 then col1 else col2 end) > col3 then (case when col1 > col2 then col1 else col2 end) else col3 end) AS MaxSpaltenWert FROM dbo.max_t ;
17.11.10 @ 09:23:20
Ok, bei NULL-Werten muss man da noch mal dran:
INSERT INTO dbo.max_t(col1, col2, col3) VALUES(45,0,NULL) ;
SELECT MAX(case when (case when coalesce(col1,0) > coalesce(col2,0) then coalesce(col1,0) else coalesce(col2,0) end) > coalesce(col3,0)
then (case when coalesce(col1,0) > coalesce(col2,0) then coalesce(col1,0) else coalesce(col2,0) end) else coalesce(col3,0) end) AS MaxSpaltenWert FROM dbo.max_t
18.11.10 @ 09:06:39
Klar, das geht natürlich auch. Hängt natürlich auch ein bisschen davon ab, ob ein Index präsent ist, wie viele Zeilen die Tabelle hat, wie oft so ein Statement ausgeführt, und und und... :-)