我需要添加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。
答案 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
。根据您的问题描述,只有在所有值都是非数字值时才会出现这种情况。