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