как суммировать только числа и показывать строки отдельно в столбце var char - PullRequest
0 голосов
/ 09 апреля 2020

Ниже приведен пример данных

create table temp (userid int , rid varchar(10), value varchar(100))
insert into temp(userid,rid,value)
values(1,'D01','3'),
(1,'D01','4'),
(2,'C01','hey'), 
(2,'C01','1')

ожидаемый вывод:

1,'D01','7'
2,'C01','hey'
2,'C01','1'

Я попробовал код ниже, и он выдает ошибку

select distinct 
    userid,rid,
    case when ISNUMERIC(value) = 1 
        THEN SUM(cast(value as int)) over (partition by userId,rid order by userid)
        else value
    end as [Value]
from temp

1 Ответ

1 голос
/ 09 апреля 2020

Сначала повторю мой комментарий:

Почему вы храните числовые данные в varchar, во-первых? Кроме того, ISNUMERIC - ужасная функция, она дает как ложные, так и отрицательные результаты. Вы используете SQL Server 2012, поэтому используйте TRY_CONVERT, однако вам гораздо лучше исправить свой дизайн.

Если вы не верите, что ISNUMERIC плохой, многие написал об этом, включая себя , Фила Фактора , Эрика Дарлинга и др.

Вы можете достичь того, чего у вас есть действительно нечетные логики c, но я сильно предлагаю исправить ваш дизайн:

SELECT userid,
       rid,
       ISNULL(CASE WHEN TRY_CONVERT(int,[value]) IS NULL THEN [value] END,SUM(TRY_CONVERT(int,[value]))) AS [value]
       --ISNULL returns the data type of the first parameter, so will implicit compvert the SUM to a varchar
FROM dbo.temp
GROUP BY userid,
         rid,
         CASE WHEN TRY_CONVERT(int,[value]) IS NULL THEN [value] END;
...