Wie kann der Mindestwert aus mehreren Spalten am besten ausgewählt werden?

Gegeben, die folgende Tabelle in SQL Server 2005:

ID   Col1   Col2   Col3
--   ----   ----   ----
1       3     34     76  
2      32    976     24
3       7    235      3
4     245      1    792

Was ist der beste Weg zu schreiben, die Abfrage liefert das folgende Ergebnis (D. H. eine, die Erträge der letzten Spalte eine Spalte mit der minium-Werte aus Col1, Col2, und Col 3 für jede Zeile)?

ID   Col1   Col2   Col3  TheMin
--   ----   ----   ----  ------
1       3     34     76       3
2      32    976     24      24
3       7    235      3       3
4     245      1    792       1

UPDATE:

Zur Verdeutlichung (wie ich schon sagte, in den coments) in der realen Szenario die Datenbank ist richtig normalisiert. Diese "array" Spalten nicht in eine tatsächliche Tabelle, aber in einer Ergebnismenge, die erforderlich ist in einem Bericht. Und die neue Anforderung ist, dass der Bericht auch die Bedürfnisse dieser MinValue Spalte. Ich kann es nicht ändern, die zugrunde liegende Ergebnismenge, und deshalb war ich auf der Suche nach T-SQL für ein handliches "get out of jail card".

Habe ich versucht, den FALL Ansatz, die unten erwähnt werden, und es funktioniert, obwohl es ein bisschen umständlich. Es ist auch komplizierter als angegeben in den Antworten, weil Sie brauchen, um zu bieten für die Tatsache, dass es zwei min Werte in der gleichen Zeile.

Sowieso, ich dachte, ich würde post meine aktuelle Lösung, die aufgrund meiner Einschränkungen, die ziemlich gut funktioniert. Es verwendet die UNPIVOT-operator:

with cte (ID, Col1, Col2, Col3)
as
(
    select ID, Col1, Col2, Col3
    from TestTable
)
select cte.ID, Col1, Col2, Col3, TheMin from cte
join
(
    select
        ID, min(Amount) as TheMin
    from 
        cte 
        UNPIVOT (Amount for AmountCol in (Col1, Col2, Col3)) as unpvt
    group by ID
) as minValues
on cte.ID = minValues.ID

Ich werde Anfang sagen, dass ich nicht erwarten, dass diese um bieten die beste Leistung, aber angesichts der Umstände (ich kann nicht-redesign-alle Abfragen, die gerade für die neuen MinValue Spalte Anforderung), ist es eine ziemlich elegante "get out of jail card".

Kommentar zu dem Problem
IMHO wird der Autor die UNPIVOT-Lösung überlegen ist, die anderen Antworten. Kommentarautor: Joe Harris
Ich finde Nizam, der die Lösung für die schlanksten Lösung, auch wenn es dauerte eine Weile, um zu starten es zu verstehen. Schlanke und sehr brauchbar. Kommentarautor: Patrick Honorez

InformationsquelleAutor der Frage stucampbell | 2008-12-15

Schreibe einen Kommentar