Как я могу преобразовать деление двух целых значений в десятичную дробь, используя T-SQL для базы данных iSeries AS / 400?

#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