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

Geben Sie die folgende Tabelle in SQL Server 2005 an:

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, um die Abfrage zu schreiben, die das folgende Ergebnis liefert (d. H. Eine, die die letzte Spalte liefert - eine Spalte mit den Mindestwerten aus Col1, Col2 und Col 3Für jede Reih)?

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

AKTUALISIEREN

Zur Verdeutlichung (wie ich in den Kommentaren gesagt habe) ist die Datenbank im realen Szenario ordnungsgemäß normalisiert. Diese "Array" -Spalten befinden sich nicht in einer tatsächlichen Tabelle, sondern in einer Ergebnismenge, die in einem Bericht erforderlich ist. Neu ist, dass der Bericht auch diese MinValue-Spalte benötigt. Ich kann die zugrunde liegende Ergebnismenge nicht ändern und habe daher bei T-SQL nach einem praktischen "Get out of Jail Card" gesucht.

Ich habe den unten genannten CASE-Ansatz ausprobiert und er funktioniert, obwohl er etwas umständlich ist. Es ist auch komplizierter als in den Antworten angegeben, da Sie die Tatsache berücksichtigen müssen, dass sich zwei min-Werte in derselben Zeile befinden.

Anyway, ich dachte, ich würde meine aktuelle Lösung posten, die aufgrund meiner Einschränkungen ziemlich gut funktioniert. Es wird der UNPIVOT-Operator verwendet:

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 sage vorweg, dass ich nicht erwarte, dass dies die beste Leistung bietet, aber unter den gegebenen Umständen (ich kann nicht alle Abfragen nur für die neue MinValue-Spaltenanforderung umgestalten), ist es ein ziemlich elegantes "Raus aus" Gefängniskarte ".

Antworten auf die Frage(36)

Ihre Antwort auf die Frage