我需要添加n列的值,但列值可以是数字,但也可以是字母,如AB,CD,EF,GH

时间:2018-04-08 05:02:49

标签: sql sql-server sql-server-2008 sql-server-2005

我需要添加n列的值,下面给出了3列的示例

SLNO    C1  C2  C3  Output
ROW1    10  10  AB  20
ROW2    10  AB  AB  10
ROW3    AB  AB  10  10
ROW4    AB  10  10  20
ROW5    AB  10  AB  10
ROW6    10  AB  10  20
ROW7    AB  AB  AB  AB
ROW8    10  10  10  30

任何Column值都可以是数值或特殊值。 特殊值,如AB,CD,EF,GH

我需要构建一个查询,它将添加这3或n列并在输出列中提供SUM。 我在使用10 + AB等字母值添加数值时遇到了麻烦。

你能帮忙做一个查询或功能或任何能帮我添加数字和字母条目的列。

如果所有列都像行slno 7那样是字母,那么输出将是任何列值

如果我们有3列,其中2列有数值而rest 1有字母值,那么我们将添加这2个数值并忽略字母值或将其视为数值0。

2 个答案:

答案 0 :(得分:0)

您也可以尝试以下TRY_PARSE

SELECT *,
    ISNULL(TRY_PARSE(C1 AS INT),0) 
  + ISNULL(TRY_PARSE(C2 AS INT),0) 
  + ISNULL(TRY_PARSE(C3 AS INT),0) AS [Output]
 FROM [Table_Name]

示例

DECLARE @TABLE TABLE(SLNO VARCHAR(10), C1 VARCHAR(10)
                    , C2 VARCHAR(10), C3 VARCHAR(10)) 

INSERT INTO @TABLE VALUES 
('ROW1', '10', '10', 'AB'), 
('ROW2','10', 'AB', 'AB' ), 
('ROW3', 'AB', 'AB', '10' ), 
('ROW4', 'AB', '10', '10' ), 
('ROW5', 'AB', '10', 'AB'), 
('ROW6', '10', 'AB', '10'), 
('ROW7', 'AB', 'AB', 'AB'), 
('ROW8', '10', '10', '10' ) 
SELECT *, 
 ISNULL(TRY_PARSE(C1 AS INT), 0) + 
 ISNULL(TRY_PARSE (C2 AS INT), 0) + 
 ISNULL(TRY_PARSE (C3 AS INT), 0) AS [Output] 
FROM @TABLE 

<强>输出

+------+----+----+----+--------+
| SLNO | C1 | C2 | C3 | Output |
+------+----+----+----+--------+
| ROW1 | 10 | 10 | AB | 20     |
+------+----+----+----+--------+
| ROW2 | 10 | AB | AB | 10     |
+------+----+----+----+--------+
| ROW3 | AB | AB | 10 | 10     |
+------+----+----+----+--------+
| ROW4 | AB | 10 | 10 | 20     |
+------+----+----+----+--------+
| ROW5 | AB | 10 | AB | 10     |
+------+----+----+----+--------+
| ROW6 | 10 | AB | 10 | 20     |
+------+----+----+----+--------+
| ROW7 | AB | AB | AB | 0      |
+------+----+----+----+--------+
| ROW8 | 10 | 10 | 10 | 30     |
+------+----+----+----+--------+

编辑:

  

Row7需要将输出反映为AB,因为所有列都是AB

如果colum值类似于&#39; AB&#39; AB&#39;,BC&#39;

,则不确定会发生什么

你仍然可以尝试以下。

SELECT SLNO,C1,C2,C3,
(
  CASE WHEN [Output] =0 THEN C1
  ELSE CAST([Output] AS VARCHAR(100))
  END
) AS [Output]

FROM

(
    SELECT *, 
     ISNULL(TRY_PARSE(C1 AS INT), 0) + 
     ISNULL(TRY_PARSE (C2 AS INT), 0) + 
     ISNULL(TRY_PARSE (C3 AS INT), 0) AS [Output] 
    FROM @TABLE 
) T

<强> DEMO

答案 1 :(得分:0)

一种方法使用apply

select t.*,
       coalesce( convert(varchar(255), sumint), max_origval) as the_sum
from t cross apply
     (select sum(intval) as sum_int, max(origval) as max_origval 
      from (values (try_convert(int, c1), c1),
                   (try_convert(int, c2), c1),
                   (try_convert(int, c3), c1)
           ) v(intval, origval);
如果所有值均为sum(),则

NULL仅返回NULL。根据您的问题描述,只有在所有值都是非数字值时才会出现这种情况。