Предполагая, что вы не можете ничего сделать для очистки данных, хранящихся в таблицах, или сделать что-либо для управления значениями, вставляемыми в указанные таблицы, вы можете использовать TRY_CONVERT или TRY_CAST. Обе функции возвращают NULL, если CHAR (1) не может преобразоваться в INT. Вы просто проверяете NULL таким образом, что вам не нужно беспокоиться о любых других символах румян, которые могут быть случайно вставлены.
IF OBJECT_ID('tempdb..#sample') IS NOT NULL
BEGIN
DROP TABLE #sample
END
GO
CREATE TABLE #sample
(
q1_c CHAR(1),
q2_c CHAR(1)
)
INSERT INTO #sample(q1_c , q2_c )
VALUES ('1','1'),('2','2'),('3','3'),('4','4'),('5','5')
,('u','U'),('$','$'), ('#','#'), ('^','^'), ('&','&'), ('*','*'),
('1','1'),('2','2'),('3','3'),('4','4'),('5','5')
SELECT CASE WHEN TRY_CAST(q1_c AS INT) IS NULL THEN '0' ELSE q1_c END A_Q1,
CASE WHEN TRY_CONVERT(INT, q2_c) IS NULL THEN '0' ELSE q2_c END A_Q2,
SUM(TRY_CAST(q1_c AS INT)) sumQ1_c, SUM(TRY_CONVERT(INT, q2_c)) sumQ2_c
FROM #sample
GROUP BY q1_c, q2_c