2015-03-02 4 views
2

Мне нужна помощь, так как я изучаю SQL, так что я на начальном уровне. Я использую SQL Server 2008 R2.SQL Server: SUM() только для числовых значений, игнорируя значения Varchar

Мой вопрос: Я хочу (добавить) подытожить колонку со значениями смешивания varchar и decimal. Я хочу игнорировать значения varchar и суммировать только decimal. Моя колонка, как это:

Column1 
------- 
0.1 
Z 
0.4 
2.1 
2.1 
Z 

И мне нужна сумма, которая в этом случае оно должно быть: 4.7

Я попытался с помощью CASE, но я не смог решить его

SELECT 
    SUM(CASE 
      WHEN ISNUMERIC(Column1) = 1 
       THEN .(if true how i add them?). 
       ELSE .(and if false how i ignore them?). 
     END) AS Total 
FROM 
    TABLE_Name 

I нехорошо объяснять вещи, но надеюсь, вы поймете меня, что я пытаюсь сделать.

Если этот вопрос уже ответил, пожалуйста, дайте мне указания на этот вопрос, и мой appologise за это .. Большое спасибо заранее :)

+0

Вот скрипка http://sqlfiddle.com/#!3/bc920/4 –

+1

Ответ заключается в том, чтобы хранить данные в нужном месте, чтобы никогда не было проблемы с суммированием нечислового столбца! – jarlh

+0

Это ** ясный признак ** ** дизайн базы данных ** ужасно плохой **, вы должны исправить это FIRST! **, прежде чем тратить больше времени на попытку подытожить такой беспорядочный столбец .... –

ответ

6

Просто используйте WHERE пункт с CAST:

SELECT SUM(Cast(Column1 as numeric(10,2))) as Total 
FROM TABLE_Name 
Where IsNumeric(Column1) = 1 

Результат:

TOTAL 
4.7 

Образец результата в SQL Fiddle.

EDIT:

Как @funkwurm указал, столбец имеет шанс иметь значение '' (точка):

SELECT SUM(Cast(Column1 as numeric(10,2))) as Total 
FROM TABLE_Name 
Where IsNumeric(Column1 + 'e0') = 1 

Fiddle.

+1

Thank вы очень. Really Quick answer :) – Bilawal

+2

Как [этот ответ] (http://stackoverflow.com/a/4522185/2684660) Я бы рекомендовал делать 'IsNumeric (Column1 + 'e0') = 1'. Если я изменил SqlFiddle, чтобы иметь строку со значением '.' для' Column1', она прерывается. – funkwurm

+0

@funkwurm: Спасибо. Я уважаю ваше мнение. Обновлен мой ответ. –

0

Вы можете "игнорировать" строку, добавив 0.

SELECT 
    SUM(
     CASE 
      WHEN ISNUMERIC(Column1)=1 THEN CONVERT(DECIMAL(10,5), Column1) --add the value to the sum 
      ELSE 0 --add 0 (i.e. ignore it) 
     END) 
    AS Total 
FROM 
    TABLE_Name 
+0

Ty для указания на мой Typo: P – Bilawal

0

попробовать

select sum(case when isnumeric(cast(Column1 as decimal)) 
then cast(column1 as decimal) else 0 end) as total from table 

предполагая ваше поле является VARCHAR тип

+0

Ty для времени ur и ответа на мой вопрос :) – Bilawal

0

Почему не используется TRY_CONVERT:

SELECT SUM(TRY_CONVERT(float,Column1) AS Total 
FROM TABLE_Name 

Кратчайший запрос и легко читается! TRY_CONVERT возвращает NULL, если преобразование завершается неудачно (например, если текстовые значения в столбце 1)

Эти функции существуют с SQL Server 2012 (я думаю).

@Jim Чен:

IsNumeric немного сложнее этот момент! В вашем решении не было бы проблемой, если значение «-» или «+» находится внутри колонны:

SELECT ISNUMERIC('+') --returns TRUE! 
SELECT ISNUMERIC('-') --returns TRUE! 

==> SUM будет FAIL!

Смежные вопросы