#tsql #casting #ibm-midrange #calculated-columns
#tsql #Кастинг #ibm-средний уровень #вычисляемые столбцы
Вопрос:
Предполагая следующий запрос:
SELECT
ID,
COUNT(1) AS NumRecords,
SUM(Quantity) AS TotalQty
SUM(Quantity)/COUNT(1) AS Avg
FROM SOME_TABLE
GROUP BY ID
Прямо сейчас он возвращает:
ID NumRecords TotalQty Avg
1 15 6 2
Я хочу, чтобы оно возвращало десятичное значение со шкалой 2 для Avg
(т. Е. «2.5»).
Я пытался CAST
вычислять как ДЕСЯТИЧНОЕ, ЧИСЛОВОЕ, с ПЛАВАЮЩЕЙ ЗАПЯТОЙ и VARCHAR, но оно всегда возвращает ЦЕЛОЕ ЧИСЛО.
Ответ №1:
Вам нужно использовать входные данные для вычисления, а не результат. Также есть причина, по которой вы не используете AVG
функцию?
AVG(CAST(Quantity as decimal(10,2)))
Комментарии:
1. ПРИВЕДЕНИЕ (СУММА (количество) КАК ДЕСЯТИЧНОЕ (10, 2) / ПРИВЕДЕНИЕ (КОЛИЧЕСТВО (1) КАК ДЕСЯТИЧНОЕ (10, 2)) приводит к возвращению 21 десятичного знака
2. Мне нужно еще одно приведение ко всему вычислению. Итак, чтобы указать масштаб, он нужен для обоих входных данных и всего вычисления.
3. @Eric — Вам нужно будет использовать только один ввод
decimal
, чтобы избежать целочисленного деления, которое сделает возвращаемый тип более предсказуемым.
Ответ №2:
Альтернативным решением является неявное приведение. Я обнаружил, что это также намного более чистый SQL. Точность будет определяться количеством конечных нулей, используемых при умножении на 1.
AVG(Quantity * 1.00) //x.xx
AVG(Quantity * 1.0000) //x.xxxx