【问题标题】:SQL Server Sum rows with string valueSQL Server Sum 行与字符串值
【发布时间】:2014-07-31 20:40:46
【问题描述】:

我有一个动态 SQL 查询,它返回如下所示的行,其中包含字符串值和数值。

EMP col1 col2 col3 col4 col5
----------------------------
A1   4     4    3   3   3
A2   4     2    5   3   3
A3  sd     3    3   1   sd
A4   3     4    3   3   3

现在我需要一个新列,它将 col1 与 col5 相加并创建一个总和列,它应该忽略第 3 行中的字符串值。没有 NULL 值

我怎样才能做到这一点?使用ISNUMERIC 可能是解决方案,但我不确定如何在这种情况下使用它。

【问题讨论】:

  • 你可以做一个 CASE WHERE col1 IN (1,2,3,etc...) 然后求和。 (无论如何,这是基本思想。

标签: sql sql-server tsql pivot


【解决方案1】:

您可以使用CASE 表达式来确定该值是否为数字。如果是数字,则将该值转换为 INT 或 DECIMAL 数据类型,否则使用 0,这样就不会影响总和。

SELECT
     CASE WHEN ISNUMERIC(col1) = 1 THEN CAST(col1 as INT) ELSE 0 END
   + CASE WHEN ISNUMERIC(col2) = 1 THEN CAST(col2 as INT) ELSE 0 END
   + CASE WHEN ISNUMERIC(col3) = 1 THEN CAST(col3 as INT) ELSE 0 END
   + CASE WHEN ISNUMERIC(col4) = 1 THEN CAST(col4 as INT) ELSE 0 END
   + CASE WHEN ISNUMERIC(col5) = 1 THEN CAST(col5 as INT) ELSE 0 END as SumValue
FROM MyTable

【讨论】:

  • OP 确实提到他们想忽略col3中的值
  • @paqogomez 不,你错过了阅读。 OP 写道“我需要一个将 col1 与 col5 相加的新列”和“它应该忽略第 3 行中的字符串值”。它没有要求忽略列。即便如此,这只是一个示例,OP 可以根据需要进行修改以包含或省略列。
  • 你说得对,我误会了。无论如何,我已经对你投了赞成票。 :)
【解决方案2】:

如果您使用的是 SQL Server 2012,TRY_CONVERT 避免使用 pitfalls commonly encountered with ISNUMERIC

SELECT col1, col2, col3, col4, col5,
       ISNULL(TRY_CONVERT(int, col1), 0) +
       ISNULL(TRY_CONVERT(int, col2), 0) +
       ISNULL(TRY_CONVERT(int, col3), 0) +
       ISNULL(TRY_CONVERT(int, col4), 0) +
       ISNULL(TRY_CONVERT(int, col5), 0) AS total
FROM Employee

SQLFiddle

【讨论】:

  • 是的,我使用的是 SQL SERVER 2012 .. 以前从未使用过 TRY_CONVERT .. 看起来很有趣.. 我知道 ISNUMERIC 的陷阱,因为我自己之前就遇到过它们.. 但在这种特殊情况下对我来说这不会是一个问题,因为数字来自计数函数
  • 但它也值得一票......因为它引入了一个新的 SQL 函数
【解决方案3】:

你可以用一个大的case语句来做到这一点:

select q.*,
       ((case when isnumeric(col1) = 1 then cast(col1 as int) else 0 end) +
        (case when isnumeric(col2) = 1 then cast(col2 as int) else 0 end) +
        (case when isnumeric(col3) = 1 then cast(col3 as int) else 0 end) +
        (case when isnumeric(col4) = 1 then cast(col4 as int) else 0 end) +
        (case when isnumeric(col5) = 1 then cast(col5 as int) else 0 end)
       ) as newcol  
from q;

isnumeric() 应该足以满足您的目的。如果您只想要正整数或想要排除指数符号等,您可能需要更高级的逻辑。

【讨论】:

    【解决方案4】:

    使用 isumeric,您走在正确的轨道上:

    select
    emp,
    (case when isnumeric(col1) = 1 then cast(col1 as int) else 0 end) +
    col2...
    from table1
    

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 2018-10-02
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 2016-06-22
      • 1970-01-01
      • 2010-10-25
      相关资源
      最近更新 更多