2014-09-03 2 views
0

Я пытаюсь решить для этого сообщения об ошибке «Ошибка преобразования типа данных varchar в float» в приведенный ниже код. Я пробовал много способов, и эта первая строка сработала. Я думаю, проблема в том, что в таблице есть NULL. Также этот тип данных составляет float.Ошибка преобразования типа данных varchar в float в case statement

SELECT 
    'May' as Month_Name -- have this for all table months that I pull data from. 
    , SUM(
     CASE 
     WHEN [All Gaps Mar] = '-' THEN 0 
     ELSE [All Gaps Mar] 
     END 
    ) AS AllGapsFeb -- works with Integer on column in other tables 
    , SUM(
     CASE 
     WHEN coalesce([All Gaps Mar], 0) = '-' THEN 0 
     ELSE [All Gaps Mar] 
     END 
    ) AS AllGapsMarch 

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

, SUM(
     CASE 
     WHEN [All Gaps Mar] = '-' THEN convert(integer, [All Gaps Mar]) 
     ELSE ([All Gaps Mar]) 
     END 
    ) AS AllGapsMarch 
    , SUM(
     CASE 
     WHEN [All Gaps Mar] = '-' THEN 0 
     ELSE convert(integer, [All Gaps Mar]) 
     END 
    ) AS AllGapsMarch 
    , CASE 
     WHEN [All Gaps Mar] = '-' 
     THEN ISNUMERIC(convert(integer, Sum([All Gaps Mar]))) 
     ELSE 0 
     END AS numeric_count 
+0

Почему вы делаете coalese с 0 и сравнивая результат со строкой? –

+0

Можете ли вы проверить свою колонку для любых не числовых значений, кроме -? Вероятно, это может вызвать ошибку, если столбец имеет алфавитный символ, который не может быть превращен в число. – Vulcronos

+0

Что вы подразумеваете под этим: "- <работает с Integer по столбцу в других таблицах"? Попробуйте удалить SUM() и посмотрите на данные, которые вы пытаетесь использовать СУММ. Есть ли строки, которые не являются ни числами, ни NULL? –

ответ

0

В SQL Server 2008 и выше:

SELECT 
    AllGapsMarch = Sum(Coalesce(Try_Convert(float, [All Gaps Mar])), 0) 

В SQL Server 2005:

SELECT 
    AllGapsMarch = Sum(Convert(float, Coalesce(N.[All Gaps Mar]), 0)) 
FROM 
    #adhoc A 
    OUTER APPLY (
     SELECT [All Gaps Mar] WHERE IsNumeric(A.[All Gaps Mar] + 'E0') = 1 
    ) N 

В SQL Server 2000 и более ранние версии:

SELECT 
    AllGapsMarch = Sum(Convert(float, (
     CASE 
     WHEN IsNumeric([All Gaps Mar] + 'E0') = 1 THEN [All Gaps Mar] 
     ELSE 0 
     END 
    )) 

У меня есть сказать, что сохранение имен месяцев в столбцах НЕ является лучшей ctice. Месяц должен быть значением в столбце вместо того, чтобы иметь один столбец за каждый месяц, а затем только в самую последнюю минуту уровень представления может сворачивать результат, чтобы обеспечить значения каждого месяца в столбцах.

Вот запрос, чтобы спровоцировать некоторые мысли о unpivoting ужасных месяцев-как-раздельный колонок парадигма:

SELECT 
    G.MonthNumber, 
    [All Gaps] = Coalesce(Sum(N.ConvertableValue), 0) 
FROM 
    #adhoc A 
    CROSS APPLY (VALUES 
     ('1', [All Gaps Jan]), 
     ('2', [All Gaps Feb]), 
     ('3', [All Gaps Mar]), 
     ('4', [All Gaps Apr]), 
     ... and so on 
    ) G (MonthNumber, StringValue) 
    OUTER APPLY (
     SELECT G.Value 
     WHERE IsNumeric(G.Value + 'E0') = 1 
    ) N (ConvertableValue) 
; 
+0

Благодарим вас за помощь. Ваш последний комментарий о ужасных месяцах был забавным. :). Однако становится все хуже. Я использую это, так как я должен использовать таблицы в течение каждого месяца, чтобы этот огромный отчет был запущен, а затем суммировать все детали за каждый месяц и сравнивать месяц за месяцем для отчета более 170 столбцов.Вот почему я использую Month_Name, чтобы затем взять сумму каждой таблицы месяца отчета. Почему они хранят это как float, я не знаю. его боль, хотя. – user3933707

+0

Я ответил на ваш вопрос? Около месяца - я поддерживаю свой комментарий. Суммирование месяцев, когда непривязанные так же легко, как и группа, сравнивает месяцы так же просто, как вычесть правильную сумму или 'DateAdd (month, -1, MonthDate)'. – ErikE

+0

Да, вы это сделали. Извините, забыл упомянуть об этом. – user3933707

0

я бегала в ту же ошибку при попытке воспроизведите это, но поняли, что моя проблема была вызвана попыткой заполнить мои фиктивные данные - исходная версия SELECT ... UNION имела все значения float как числа, поэтому я делал SELECT 101, SELECT 16.6 и т. д. Пытаясь использовать данные UNION float и varchar, не используя CAST для обеспечения того, чтобы они были одного типа или охватывали числа в кавычках, я получил то же сообщение, которое вы видели ... использует ли что-то вроде запроса ниже, получите то, что вам нужно ?

CREATE TABLE #adhoc ([All Gaps Mar] varchar(20),OtherField varchar(20)) 

INSERT INTO #adhoc 
SELECT '101','ABC' 
UNION 
SELECT '16.6','123' 
UNION 
SELECT '3.14','May' 
UNION 
SELECT 'Not Numeric','March' 
UNION 
SELECT '42.0','Feb' 
UNION 
SELECT 'abc','Test' 

SELECT 'May' as Month_Name, 
SUM(CASE WHEN ISNUMERIC([All Gaps Mar])=1 THEN CAST([All Gaps Mar] AS float) ELSE 0 END) Total 
FROM #adhoc 

/* alternate approach */ 
SELECT 'May' Month_Name, SUM(CAST([All Gaps Mar] as float)) 
FROM 
(
SELECT [All Gaps Mar] FROM #adhoc WHERE ISNUMERIC([All Gaps Mar])=1 
) tmp 

DROP TABLE #adhoc