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.

  • ****-
    Kommentar von: Christoph Muthmann
    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 ;

  • Kommentar von: Christoph Muthmann
    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

  • Kommentar von: Frank Kalis
    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... :-)

Einen Kommentar hinterlassen

Ihre E-Mail-Adresse wird nicht auf dieser Seite angezeigt.
SchlechtExzellent
(Zeilenumbrüche werden zu <br />)
(For my next comment on this site)
(Allow users to contact me through a message form -- Your email will not be revealed!)
Dies ist ein Captcha Bild. Es wird benutzt, um Massenzugriffe von Robotern zu verhindern.
Bitte gib die Zeichen des obigen Bildes ein. (Groß/Kleinschreibung ist wichtig)
Trackback-Adresse für diesen Eintrag
Dies ist ein Captcha Bild. Es wird benutzt, um Massenzugriffe von Robotern zu verhindern.
Bitte gib die Zeichen des obigen Bildes ein. (Groß/Kleinschreibung ist wichtig)