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, um die Abfrage zu schreiben, die das folgende Ergebnis liefert (dh eine, die die letzte Spalte ergibt - eine Spalte, die die Miniumwerte von Col1, Col2 und Col3 für jede Zeile enthält )?
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) wird 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. Die neue Anforderung besteht darin, dass der Bericht auch diese MinValue-Spalte benötigt. Ich kann die zugrunde liegende Ergebnismenge nicht ändern und habe daher bei T-SQL nach einer praktischen "Ausstiegskarte" gesucht.
Ich habe den unten erwähnten 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.
Wie auch immer, ich dachte, ich würde meine aktuelle Lösung veröffentlichen, die angesichts meiner Einschränkungen ziemlich gut funktioniert. Es verwendet den 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 im Voraus sagen, dass ich nicht erwarte, dass dies die beste Leistung bietet, aber angesichts der Umstände (ich kann nicht alle Abfragen nur für die neue MinValue-Spaltenanforderung neu gestalten) ist es ein ziemlich eleganter Ausstieg aus dem Gefängnis Karte".