Мне нужно добавить значения n столбцов, но значения столбцов могут быть числовыми, а также буквенными, такими как AB, CD, EF, GH

avatar
Raghuveer Devraj Shetty
8 апреля 2018 в 05:02
39
2
0

Мне нужно добавить значения 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

Любое значение столбца может быть числовым или специальным значением. Специальные значения, такие как AB,CD,EF,GH

Мне нужно построить запрос, который добавит эти 3 или n столбцов и предоставит СУММУ в выходных столбцах. У меня возникли проблемы с добавлением числового значения к буквенному значению, например 10 + AB.

Не могли бы вы помочь мне сделать запрос или функцию или что-нибудь, что поможет мне добавить n столбцов с числовыми и буквенными записями.

если все столбцы в алфавитном порядке, как строка slno 7, то вывод будет любым значением столбца

если у нас есть 3 столбца и 2 из которых имеют числовое значение, а остальные 1 имеют буквенное значение, то мы добавим эти 2 числовых значения и проигнорируем буквенное значение или обработаем его как числовое значение 0.

Источник
rwp
8 апреля 2018 в 05:06
0

Можете ли вы привести пример того, чего вы пытаетесь достичь - не очевидно, каким должен быть правильный ответ на (10 + AB). Спасибо.

Tim Biegeleisen
8 апреля 2018 в 05:06
1

Необходимость суммирования по столбцам, возможно, является признаком плохого дизайна таблицы. Но хранение числовых и символьных данных в одном столбце — определенно плохой дизайн, как вы до этого дошли?

Tim Biegeleisen
8 апреля 2018 в 05:06
0

@rwp В этом случае ОП хочет игнорировать или заменить нулем.

Ответы (2)

avatar
Gordon Linoff
8 апреля 2018 в 12:16
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. Судя по описанию вашей проблемы, это произойдет только в том случае, если все значения не являются числовыми.

avatar
PSK
8 апреля 2018 в 05:17
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     |
+------+----+----+----+--------+

Редактировать:

Строка 7 должна отражать выходные данные как AB, так как все столбцы имеют вид AB

Не уверен, что произойдет, если значения столбцов будут такими, как «AB», «AB», «BC»

Тем не менее, вы можете попробовать следующее.

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

ДЕМО

Raghuveer Devraj Shetty
8 апреля 2018 в 06:16
0

Row7 должен отражать вывод как AB, так как все столбцы AB

Tim Biegeleisen
8 апреля 2018 в 06:25
0

@RaghuveerDevrajShetty Почему вы используете этот плохой дизайн таблицы? Как правило, не смешивайте числовые и текстовые данные в одном столбце.

PSK
8 апреля 2018 в 08:11
0

@RaghuveerDevrajShetty рассмотрите возможность принятия ответа, если он разрешил ваш запрос