给定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列要求重新设计所有查询),这是一个非常优雅的“摆脱困境”卡”。