У меня есть таблица с именем Food
, которая содержит столбцы BoxNumber, Analyte и AnalyteVal.
Мне нужна сумма конкретных аналитов (ana1, ana3, ana4) в этих полях. Как я могу это сделать?
Необработанные данные:
(Integer) (Varchar) (Varchar)
BoxNumber | Analyte | AnalyteVal
1 ana1 5
1 ana2 6
1 ana3 2f
1 ana4 6
2 ana3 1
2 ana4 4
3 ana1 2
3 ana2 4f
3 ana3 NULL
Результаты должны быть:
BoxNumber | AnalyteVal
1 11
2 5
3 2
Моя попытка:
SELECT BoxNumer,
SUM(CAST(ISNUMERIC(AnalyteVal) AS DECIMAL(10,2))) AS [DesiredSum]
FROM Food
WHERE analyte IN ('ana1','ana3','ana4')
GROUP BY BoxNumber
@ZoharPeled Microsoft SQL Server 2008 R2 (SP2)
Для значений AnalyteVal, которые содержат нечисловые данные, 2f или 4f, вы хотите проанализировать число или проигнорировать значение?
Игнорировать значение
Погуглите функцию ISNUMERIC
и прочтите, что она делает. Это не то, что ты думаешь.
Будет ли в этом столбце десятичная дробь?
@paparazzo да.
Попробуй это:
Select
BoxNumber,
sum(CAST(AnalyteVal AS DECIMAL(10,2))) as [DesiredSum]
from Food
where analyte in ('ana1','ana3','ana4') and ISNUMERIC(AnalyteVal)=1
group by BoxNumber
Рабочий пример SQLFiddle здесь.
Нет необходимости использовать distinct
select BoxNumber, sum(cast(AnalyteVal AS DECIMAL(10, 2))) as [DesiredSum]
from Food
where analyte in ('ana1','ana3','ana4') and
isnumeric(AnalyteVal) = 1
group by BoxNumber;
если у вас более поздняя версия SQL Server, вы можете использовать try_convert()
вместо
select BoxNumer, sum(cast(AnalyteVal as DECIMAL(10, 2))) as [DesiredSum]
from Food
where analyte in ('ana1','ana3','ana4') and
try_convert(int, AnalyteVal) is not null
group by BoxNumber;
Йогеша, я повторяю 224к строк. Могу ли я добавить еще одну ошибку, чтобы предотвратить ошибку «Ошибка преобразования типа данных varchar в числовой»? Я не уверен, что отбрасывает мою колонку AnalyteVal.
@Brad ... Ваш явный разговор, возможно, вызывает проблему. Итак, я предлагаю удалить функцию cast()
.
@Yogesh, тип данных операнда varchar недопустим для оператора суммы.
@Brad .. Используйте cast()
Попробуйте этот запрос.
SELECT boxnumber,
Sum(Cast(analyteval AS DECIMAL(10, 2))) AS [DesiredSum]
FROM food
WHERE analyte IN ( 'ana1', 'ana3', 'ana4' )
AND analyteval NOT LIKE '%[^0-9]%'
GROUP BY boxnumber;
Или это...
SELECT boxnumber,
Sum(Cast(analyteval AS DECIMAL(10, 2))) AS [DesiredSum]
FROM food
WHERE analyte IN (SELECT DISTINCT analyte
FROM food
WHERE analyte <> 'ana2')
AND analyteval NOT LIKE '%[^0-9]%'
GROUP BY boxnumber;
Результат
+-----------+------------+
| boxnumber | DesiredSum |
+-----------+------------+
| 1 | 11 |
| 2 | 5 |
| 3 | 2 |
+-----------+------------+
Я считаю, что это должно сработать:
SELECT BoxNumber,
SUM(cast(AnalyteVal as int)) AS DesiredSum
FROM Food
WHERE analyte in ('ana1', 'ana3','ana4')
AND IsNumeric(AnalyteVal) = 1
GROUP BY BoxNumber
С какой версией SQL Server вы работаете?