Biorąc pod uwagę poniższą tabelę w programie SQL Server 2005:
ID Col1 Col2 Col3
-- ---- ---- ----
1 3 34 76
2 32 976 24
3 7 235 3
4 245 1 792
Jaki jest najlepszy sposób napisania zapytania, które daje następujący wynik (tj. Takie, które daje ostatnią kolumnę - kolumnę zawierającą wartości minimalne z Col1, Col2 i Col 3 dla każdego wiersza )?
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
AKTUALIZACJA:
Dla wyjaśnienia (jak powiedziałem w komentarzach) w rzeczywistym scenariuszu baza danych jest odpowiednio znormalizowana . Te kolumny „macierzy” nie znajdują się w rzeczywistej tabeli, ale w zestawie wyników wymaganym w raporcie. Nowym wymaganiem jest to, że raport potrzebuje również tej kolumny MinValue. Nie mogę zmienić bazowego zestawu wyników i dlatego szukałem w T-SQL przydatnej karty „wyjście z więzienia”.
Wypróbowałem opisane poniżej podejście CASE i działa, chociaż jest trochę uciążliwe. Jest to również bardziej skomplikowane niż podano w odpowiedziach, ponieważ należy wziąć pod uwagę fakt, że w tym samym wierszu znajdują się dwie wartości minimalne.
W każdym razie pomyślałem, że opublikuję moje obecne rozwiązanie, które, biorąc pod uwagę moje ograniczenia, działa całkiem nieźle. Wykorzystuje operator UNPIVOT:
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
Powiem z góry, że nie spodziewam się, że zapewni to najlepszą wydajność, ale biorąc pod uwagę okoliczności (nie mogę przeprojektować wszystkich zapytań tylko dla nowego wymagania kolumny MinValue), jest to dość eleganckie „wyjście z więzienia karta".