【发布时间】:2018-03-16 08:06:10
【问题描述】:
我正在处理从 Oracle 导入 SQL Server 2012 的旧旧数据库。我有一个名为INSOrders 的表,其中包括一个名为OrderID 的列,类型为varchar(8)。
插入数据的一个例子是:
A04-05 | B81-02 | C02-01
A01-01 | B95-01 | C99-05
A02-02 | B06-07 | C03-02
A98-06 | B10-01 | C17-01
A78-07 | B02-03 | C15-03
A79-01 | B02-01 | C78-06
第一个字母 = 订单类型,接下来的 2 位数字 = 年份 - 最后 2 位数字 = 该年份内的 OrderNum。
所以我将所有数据分成 3 列:(未存储,仅显示)
select
orderid,
substring(orderid, 0, patindex('%[0-9]%', orderid)) as ordtype,
right(max(datepart(yyyy, '01/01/' + substring(orderid, patindex('%[0-9]-%', orderid) - 1, 2))),2) as year,
max(substring(orderid, patindex('%-[0-9]%', orderid) + 1, 2)) as ordnum
from
ins.insorders
where
orderid is not null
group by
substring(orderid, 0, patindex('%[0-9]%', orderid)), orderid
order by
ordtype
它看起来像这样:
OrderID | OrderType | OrderYear | OrderNum
---------+-------------+-------------+----------
A04-05 | A | 04 | 05
A01-01 | A | 01 | 01
B10-03 | B | 10 | 03
B95-01 | B | 95 | 01
etc....
但现在我只想为所有OrderType 选择最大值:仅显示字母 A 的最大值,显示字母 B 的最大值等。我的意思是 Max,我的意思是来自 Letter AI 需要显示最近的年份和最新的订单号。所以如果我有 A04-01 和 A04-02 就显示 A04-02。
如果我能看到以下内容,我需要修改我的查询:
OrderID | OrderType | OrderYear | OrderNum
---------+-------------+-------------+----------
A04-05 | A | 04 | 05
B10-03 | B | 10 | 03
C17-01 | C | 17 | 01
谢谢您,我将非常感谢您的帮助。
【问题讨论】:
-
这有点奇怪,所以我假设
B10-03OrderYear显示10而不是95因为10表示为2010和95表示为1995? -
这不是像使用 MAX(orderid) 并从 group by 中删除 orderid 一样简单吗?
标签: sql-server function split substring max