如何使用unpivot函数忽略字符串值,在其他列中查找最小值

时间:2018-10-29 22:07:03

标签: sql sql-server tsql pivot unpivot

我有一张看起来像这样的桌子

enter image description here

目标是在列Limit(Limit1,Limit2,Limit3 ...等)中找到一个最小值。

为此,我正在使用UNPIVOT函数。

但是问题是某些值是空字符串。结果,最小值变为空字符串。

declare @TempTable2 table (ID int, limit1 varchar(50),limit2 varchar(50),limit3 varchar(50),limit4 varchar(50),limit5 varchar(50) )
insert into @TempTable2 values   (1,'1000','1000','3000',NULL, NULL)
                                ,(2,'2000','4000','3000','', NULL)

--select * from @TempTable2
Select  ID, 
        min(Amount) as TheMin
from @TempTable2
    unpivot (Amount for AmountCol in (Limit1,Limit2,Limit3,Limit4,Limit5)) as unpvt
group by ID

enter image description here

那么在使用UNPIVOT函数时如何忽略字符串值?

我希望我的结果像这样:

ID  TheMin
1   1000
2   2000

我尝试使用NULLIF,但UNPIVOT不接受。 谢谢

2 个答案:

答案 0 :(得分:2)

另一个选择是NullIf()

示例

Select  ID, 
        min(nullif(Amount,'')) as TheMin
from @TempTable2
    unpivot (Amount for AmountCol in (Limit1,Limit2,Limit3,Limit4,Limit5)) as unpvt
group by ID

返回

ID  TheMin
1   1000
2   2000

答案 1 :(得分:1)

因为您的dataType是字符串类型,并且一列包含''

您可以尝试在MINCAST中使用条件汇总函数将int用作

Select  ID, 
        min(CASE WHEN Amount like '%[0-9]%'  THEN CAST(Amount AS INT)  END) as TheMin
from @TempTable2
    unpivot (Amount for AmountCol in (Limit1,Limit2,Limit3,Limit4,Limit5)) as unpvt
group by ID

sqlfiddle

ID  TheMin
1   1000
2   2000

注意

如果您仅在其中存储数字,我建议您的列将保存int而不是varchar