SQL Server 2005 の次の表を考えてみます。
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 列の要件のためだけにすべてのクエリを再設計することはできません)、非常にエレガントな「脱獄」です。カード"。