【问题标题】:SQL Server : SUM of column with alphanumeric valuesSQL Server:具有字母数字值的列的总和
【发布时间】:2020-03-22 12:19:22
【问题描述】:

我想得到字母数字列的总和。如果不是数字,我想添加数值并返回列值。我所做的是添加了一个看起来像这样的CASE WHEN

CASE 
   WHEN intAllocatedResourceperDivision NOT IN ('CL', 'HS', 'HV', 'ML', 'SL', 'VL', 'HC', 'S', '*') 
      THEN CAST(SUM(ISNULL(CAST(intAllocatedResourceperDivision AS DECIMAL), 0.00)) AS NVARCHAR(250)) 
      ELSE intAllocatedResourceperDivision 
END intAllocatedResourceperDivision

所以我假设将添加所有数值,如果值在('CL', 'HS', 'HV', 'ML', 'SL', 'VL', 'HC', 'S', '*') 中,它将按原样返回。

但我得到了

将数据类型 nvarchar 转换为数值时出错。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。样本数据和期望的结果也会有所帮助。
  • @GordonLinoff 更新

标签: sql sql-server case-when alphanumeric


【解决方案1】:

看起来您的 SUM 聚合不合适。仅当 case 语句中的条件为真时才求和。试试这个:

SUM(case when intAllocatedResourceperDivision NOT IN ('CL','HS','HV','ML','SL','VL','HC','S','*') THEN intAllocatedResourceperDivision else 0 end)

如果您不知道非数字值的确切潜在组合,您可以使用ISNUMERIC 函数(假设您使用 SQL Server)来测试该值是否为数字并分配 0如果不是,则汇总最终结果。

SUM(case when ISNUMERIC(intAllocatedResourceperDivision) = 1 then intAllocatedResourceperDivision else 0 end)

要聚合数值并保持非数值,您可以使用联合查询:

select
    cast(SUM(cast(intAllocatedResourceperDivision as decimal(18,2))) as varchar)
from
    YOUR_TABLE
where
    ISNUMERIC(intAllocatedResourceperDivision) = 1

UNION ALL

select
    intAllocatedResourceperDivision
from
    YOUR_TABLE
where
    ISNUMERIC(intAllocatedResourceperDivision) = 0

【讨论】:

  • 想要按原样返回值,如果不是数值则返回 ('CL','HS','HV','ML','SL','VL','HC','S ','*') 是可能的
  • 可以采用不同的方法。您必须将数据拆分为 2 个不同的数据集(数字和非数字),执行聚合,然后再次将两个数据集组合在一起。我已经更新了我的答案以反映这一点。
【解决方案2】:

这看起来像 SQL Server 语法。我建议使用TRY_CONVERT():

TRY_CONVERT(DECIMAL, intAllocatedResourceperDivision) as intAllocatedResourceperDivision

【讨论】:

  • 如果不是数值,则希望按原样返回值,返回 ('CL','HS','HV','ML','SL','VL','HC','S','*') 是可能的
  • @guradio 。 . .我不明白其中的逻辑。你想要一个数字还是一个字符串作为返回值?问题中的样本数据和预期结果会有所帮助。
  • 如果值是数字,如果不是数字,我希望结果是数字的总和,然后返回当前值(我们在 (('CL','HS','HV','ML','SL','VL','HC','S','*')) 中的任何一个值
【解决方案3】:

试试这个:

select 'CL' as intAllocatedResourceperDivision into #tmp
union select 'HS'union select 'HV'union select 'ML'union select 'SL'union select 'VL'union select 'HC'union select 'S'union select '*'union select '1'union select '4'

select CAST(SUM(ISNULL(CAST(intAllocatedResourceperDivision AS DECIMAL),0.00)) AS nvarchar(250)) as intAllocatedResourceperDivision
from #tmp where intAllocatedResourceperDivision NOT IN ('CL','HS','HV','ML','SL','VL','HC','S','*')
union 
select intAllocatedResourceperDivision
from #tmp where intAllocatedResourceperDivision IN ('CL','HS','HV','ML','SL','VL','HC','S','*')

【讨论】:

  • 想要按原样返回值,如果不是数值则返回 ('CL','HS','HV','ML','SL','VL','HC','S ','*') 是可能的
猜你喜欢
  • 2015-07-13
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 2021-02-08
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多