我一直试图弄清楚如何转换返回2位数的选择结果,然后我想将其转换为年份,这样我就可以获取当年的max()值。
我的表:
ins_order
------------------------
RSN | ordered
---------------
1 | A04-01
2 | A12-02
3 | A98-01
4 | B00-10
2 | B10-02
3 | C97-01
4 | C03-10
依旧......
我的选择状态如下:
select
max(substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2)) as year
from
ins.insorders
where
orderid is not null
group by
substring(orderid, 0, patindex('%[0-9]%', orderid))
order by
year
这将返回:
year
---------
98
10
97
但是当我使用max时,它返回每个字母的最高编号,但在获得最高编号之前,我需要将这2个数字转换为年份格式,以便它可以理解17实际上是最高的,因为我们是在2017年。< / p>
答案 0 :(得分:2)
正如Sean Lange在评论中所说,在尝试以有意义的方式使用它之前,您必须将substring()
转换为有意义的值。
select
Ltr = substring(orderid, 0, patindex('%[0-9]%', orderid))
, Year = max(case when convert(int,substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2)) < 50
then convert(int,'20'+substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2))
else convert(int,'19'+substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2))
end)
from ins_orders
group by substring(orderid, 0, patindex('%[0-9]%', orderid))
order by year desc
rextester演示:http://rextester.com/ZRV37957
返回:
+-----+------+
| Ltr | Year |
+-----+------+
| A | 2012 |
| B | 2010 |
| C | 2003 |
+-----+------+