SQL Server2005の次の表を考えます。
ID Col1 Col2 Col3
-- ---- ---- ----
1 3 34 76
2 32 976 24
3 7 235 3
4 245 1 792
次の結果を生成するクエリを作成するための最良の方法は何ですか(つまり、最終列を生成するクエリ-各行のCol1、Col2、およびCol 3からの最小値を含む列)?
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
更新:
(コメントで述べたように)実際のシナリオで明確にするために、データベースは適切に正規化されています。これらの「配列」列は実際のテーブルにはありませんが、レポートに必要な結果セットにあります。また、新しい要件は、レポートにもこのMinValue列が必要であることです。基になる結果セットを変更できないため、便利な「刑務所カードから抜け出す」ためにT-SQLを探していました。
少し面倒ですが、下記のCASEアプローチを試してみました。また、同じ行に2つの最小値があるという事実に対応する必要があるため、回答に記載されているよりも複雑です。
とにかく、私は現在の解決策を投稿すると思いました。これは私の制約を考えると、かなりうまく機能します。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
これが最高のパフォーマンスを提供するとは思わないことを前もって言いますが、状況を考えると(新しいMinValue列の要件のためだけにすべてのクエリを再設計することはできません)、かなりエレガントな「脱獄」です。カード"。