最佳答案
给定 SQLServer2005中的下表:
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 方法,虽然有点麻烦,但是它很有效。它也比答案中所说的更复杂,因为您需要考虑到同一行中有两个 min 值这一事实。
无论如何,我认为我应该发布我当前的解决方案,考虑到我的约束,它工作得很好。它使用了 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 列需求而重新设计所有查询) ,这是一张相当优雅的“出狱卡”。