2013-12-23 2 views
0

Попытки получить среднее из, но продолжает получать сообщение об ошибке:SQL на «AVG»

Операнда типа данных VARCHAR недопустим для оператора Avg.

Вот SQL:

select 
     COUNT(Amount)AS "TOTAL Sales Daily", 
     MIN(Amount) AS "MIN Sales Daily", 
     MAX(Amount) AS "MAX Sales Daily", 
     CAST(AVG(Amount)AS INTEGER) AS "AVG Salses Daily"   
from CMP_SalesDaily_Data; 
+2

Почему вы хранящий сумму в виде строки? – Zane

+3

[Плохие привычки пинать: выбор неправильного типа данных] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad-habits-to-kick-using-the-wrong-data- type.aspx) - вы всегда должны использовать наиболее подходящий тип данных - вот для чего они нужны, в конце концов! 'Amount' должен быть числовым типом данных -' INT' или 'DECIMAL' - в зависимости от того, что - просто ** NOT **' Varchar' !! –

ответ

0

Ваше Amount поле может быть типа VARCHAR. Попробуйте CAST или CONVERT, прежде чем передавать его на AVG.

(при условии, что это SQL-сервер)

2

CAST находится в неправильном месте.

select 
     COUNT(Amount)AS "TOTAL Sales Daily", 
     MIN(Amount) AS "MIN Sales Daily", 
     MAX(Amount) AS "MAX Sales Daily", 
     AVG(CAST(Amount AS INTEGER)) AS "AVG Salses Daily"   
from CMP_SalesDaily_Data; 

Один из способов справиться с этим эффективно, если вы не имеете никакого контроля над типом данных СУММА, в может быть, чтобы сделать это по дороге в:

select 
     COUNT(Amount)AS "TOTAL Sales Daily", 
     MIN(Amount) AS "MIN Sales Daily", 
     MAX(Amount) AS "MAX Sales Daily", 
     AVG(Amount) AS "AVG Salses Daily"   
from (
    select cast(amount as integer) as amount from CMP_SalesDaily_Data 
); 

Тем не менее, не забудьте проверить, что CAST ISN (например, у вас нет таких вещей, как «Н/Д» в данных, которые нужно обрабатывать чисто).

+0

Кроме того, у вас есть опечатка в имени столбца, возможно. «Avg Salses» звучит как yummy guacamole, но, вероятно, предполагается, что это «Avg Sales». – Joe

+2

Удаленный мой, поскольку этот ответ пришел первым. Это твоя проблема. Однако я бы тоже добавил это. STOP ХРАНЕНИЕ ЧИСЛЕННЫХ ЗНАЧЕНИЙ КАК STRINGS, и у вас не будет этой проблемы. – Zane

+2

Я бы также добавил: 'MIN' и' MAX' и даже 'COUNT' не делают то же самое для' VARCHAR', как и для 'INTEGER', поэтому вы можете получить нежелательные результаты из тех частей также и запрос (без добавления CASTs к ним). – Joe

0

попробовать это:

AVG(cast(Amount AS INTEGER)) AS "AVG Salses Daily" 
+0

Получено. «Ошибка преобразования при преобразовании значения varchar« 264.00 »в тип данных int.» Ненавижу, что тип данных «varchar» – user3130669

+0

попробуйте сделать его плавающим тогда ... AVG (cast (Amount AS float)) AS «AVG Salses Daily» – BWS