鉴于 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 方法,它可以工作,虽然它有点麻烦。它也比答案中所说的更复杂,因为您需要满足同一行中有两个最小值的事实。
无论如何,我想我会发布我当前的解决方案,考虑到我的限制,它工作得很好。它使用 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 列要求重新设计所有查询),这是一个非常优雅的“越狱”卡片”。