Maximum über verschiedene Spalten einer Tabelle

By Frank Kalis

Posted on Nov 12, 2010 von in SQL Server

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.

Dieser Eintrag wurde eingetragen von und ist abgelegt unter SQL Server.

3 Kommentare

Benutzerwertungen
5 Stern:
 
(0)
4 Stern:
 
(1)
3 Stern:
 
(0)
2 Stern:
 
(0)
1 Stern:
 
(0)
1 Bewertung
Durschn. Benutzerwertung:
(4.0)
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: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
17.11.10 @ 09:23
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... :-)
18.11.10 @ 09:06


Formular wird geladen...