【问题标题】:SQL Server: How to keep track of CURRENT occurrence of A substring in a stringSQL Server:如何跟踪字符串中 A 子字符串的当前出现
【发布时间】:2019-08-28 17:14:10
【问题描述】:

我有两列,PO_NUMBERPO_COUNTERPO_NUMBER 列有许多采购订单号。例如,601A-00001、601A-00002、601A-00003....601A-00101。我需要PO_COUNTER 列来计算每个项目中的采购订单数量。项目编号是“-”左侧的数字,当它们是 PO_NUMBER 中的不同项目编号时,计数应从 1 开始。下面粘贴的屏幕截图是最终结果集的外观......

我尝试过使用 SUBSTRING 和 CHARINDEX.....

select PO_number, RIGHT(PO_number, CHARINDEX('0', REVERSE(PO_Number))-1)
from Purchase_Order
order by PO_NUMBER

但是当 PO_NUMBER 602A-00105 和 601A-00101 如上所示时,我的代码返回 5 和 1,因为它们是最后一次出现 0 之后的数字。

我也试过了……

select PO_number, SUBSTRING(po_number, CHARINDEX('-', po_number) + 1, LEN(po_number) - CHARINDEX('-', po_number)) domain
from Purchase_Order
order by PO_NUMBER

但这会返回“-”之后的所有内容,我不希望这样。

【问题讨论】:

  • 使用第二个选项并修剪零,如stackoverflow.com/a/662437/3770885
  • 寻找连字符而不是零。照原样,您可以去掉最后五个字符。
  • 不是你想要'-'之前的所有东西吗?如果是,为什么你不能修改你的第二个脚本来获取它?

标签: sql sql-server


【解决方案1】:

尝试进行以下更改:

select PO_number, try_convert(int, RIGHT(PO_number, CHARINDEX('-', REVERSE(PO_Number))-1))
from Purchase_Order
order by PO_NUMBER

【讨论】:

    【解决方案2】:

    如果计数后缀始终采用00000 格式,那么您可以仅提取它并通过将其转换为整数来消除前导零。

    select PO_number, cast(right(PO_number,5) as int)
    from Purchase_Order
    order by PO_number;
    

    【讨论】:

      【解决方案3】:

      以下做了一些假设:

      • 您使用的是支持排名功能的 SQL Server 版本
      • PO_Number 中的每个值都至少包含一个连字符,并且在第一个连字符之前有一个或多个字符
      • 计算项目编号,它不会提取采购订单编号...或者您想如何处理数据中的空白?
      SELECT
         PO_Number
        ,row_number() over (partition by left(PO_Number, charindex('-', PO_Number) - 1)  order by PO_Number)  PO_Counter
       from Purchase_Order
       order by PO_Number, PO_Counter
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-17
        • 1970-01-01
        • 2014-03-21
        • 2014-10-29
        • 2012-07-23
        • 2021-06-05
        • 2023-01-09
        相关资源
        最近更新 更多