【问题标题】:Distinguish between 1000 and 10000 in Select LEFT for groupings在 Select LEFT 中区分 1000 和 10000 进行分组
【发布时间】:2021-01-01 13:11:42
【问题描述】:

我目前有一个 Select LEFT,它正在抓取 ID 字段的左第一个数字。只要我们的 ID 号是 4 位数字(0 到 9999),它就可以正常工作,但是我们现在引入了 10,000 范围内的 5 位数字,当前的 Select LEFT 无法区分 1,000 和 10,000 之间的差异。选择第一个数字的目的是按千位(1000、2000、3000、...、100000)对数字进行分组。正在发生的事情是 10000 现在被分组到 1000 组中,而不是创建新的 10000 组。请参阅下面的代码。

SELECT
LEFT(table.IDField,1) as PolicyGroup,
CASE LEFT(table.IDField,1)
   WHEN '1' THEN '1000 Group' 
   WHEN '2' THEN '2000 Group' 
   WHEN '3' THEN '3000 Group' 
   WHEN '4' THEN '4000 Group' 
   WHEN '5' THEN '5000 Group' 
   WHEN '6' THEN '6000 Group' 
   WHEN '7' THEN '7000 Group' 
   WHEN '8' THEN '8000 Group' 
   WHEN '9' THEN '9000 Group' 
   WHEN '10' THEN '10000 Group' 
END as PolicyExplanation,
cpsys_Datacurrent.IntegrationId as PolicyNumber2

ID 字段没有在数字前面填充任何内容,因此 4 位只有 4 位,5 位只有 5,但我需要能够按千人分组,包括 10,000 人组。

【问题讨论】:

  • 您可能还会遇到排序问题,因为您可能一直在进行字母排序。

标签: sql sql-server string select case


【解决方案1】:

为什么不使用算术?

如果您的数据库进行整数除法:

IDField / 1000 * 1000 as PolicyExplanation

如果没有:

floor(IDField / 1000) * 1000 as PolicyExplanation

如果IDField 是一个字符串,那么根据您的数据库,可能需要显式转换:

floor(cast(IDField as int) / 1000) * 1000 as PolicyExplanation

【讨论】:

  • 我似乎无法在我的 ID 字段上工作。以下是我根据您的建议编写它的方法,但我在 cast 函数中遇到错误(此评论底部的错误)。选择 floor(cast(cpsys_Datacurrent.IntegrationId as int) / 1000) 作为 PolicyGroup,CASE floor(cast(cpsys_Datacurrent.IntegrationId as int) / 1000) WHEN '1' THEN 'Human Resources' WHEN '2' THEN 'General Services/Marketing ' . . WHEN '9' THEN 'Operations' WHEN '10' THEN 'Cyber​​security' END as PolicyExplanation, Error - DataSource: Conversion failed when convert the nvarchar value to data type int.
  • @rjohns68: 那么这意味着IDField 中的某些值包含的不仅仅是数字。您可以使用 try_cast() 而不是 cast() 来解决此问题。
【解决方案2】:

这样的表达式将处理个位数问题以及用于排序目的的带有前导零的左填充:

right('0' + cast(cast(IDField as int) / 1000 as varchar(2)) + '000 Group', 11)

【讨论】:

  • 感谢肖恩的帮助。我采用了 GMB 方法,因为我认为它更适合我的需要。但我非常感谢您对您的建议的帮助。
猜你喜欢
  • 1970-01-01
  • 2016-10-08
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2015-04-26
  • 1970-01-01
相关资源
最近更新 更多