Подсчет различных типов

У меня есть таблица с именем 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

С какой версией SQL Server вы работаете?

Zohar Peled 01.05.2018 18:58

@ZoharPeled Microsoft SQL Server 2008 R2 (SP2)

Brad 01.05.2018 19:00

Для значений AnalyteVal, которые содержат нечисловые данные, 2f или 4f, вы хотите проанализировать число или проигнорировать значение?

Eric Brandt 01.05.2018 19:24

Игнорировать значение

Brad 01.05.2018 20:09

Погуглите функцию ISNUMERIC и прочтите, что она делает. Это не то, что ты думаешь.

Tab Alleman 01.05.2018 21:05

Будет ли в этом столбце десятичная дробь?

paparazzo 01.05.2018 21:41

@paparazzo да.

Brad 07.05.2018 17:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
7
87
4

Ответы 4

Попробуй это:

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 01.05.2018 19:11

@Brad ... Ваш явный разговор, возможно, вызывает проблему. Итак, я предлагаю удалить функцию cast().

Yogesh Sharma 01.05.2018 20:27

@Yogesh, тип данных операнда varchar недопустим для оператора суммы.

Brad 07.05.2018 17:22

@Brad .. Используйте cast()

Yogesh Sharma 07.05.2018 17:23

Попробуйте этот запрос.

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

Другие вопросы по теме