Добавление десятичных знаков в запросе выбора к сумме

Я создал запрос выбора, который использует функцию SUM, и пытаюсь отобразить выходные данные с двумя десятичными знаками для суммы урегулирования. В этом примере фактическое значение STTL_AMOUNT равно 29999, но я бы хотел, чтобы оно вывело 299,99, поэтому мне нужно добавить десятичный знак перед двумя последними числами. Формат STTL_AMOUNT — число (22,4).

SELECT COUNT (STTL_AMOUNT) as "COUNT",
   SUM(STTL_AMOUNT) - SUM(CASE WHEN IS_REVERSAL =1 THEN STTL_AMOUNT ELSE 0 End ) as "Settlement Amount",
   HOST_DATE as "Settlement Date"
   FROM  OPR_OPERATION
   WHERE    MCC = '6011'
   AND      MSG_TYPE ='MSGTPRES'
   AND      HOST_DATE >= TRUNC( SYSDATE )
   GROUP BY HOST_DATE;

И я получаю результат ниже:

"COUNT" "Settlement Amount" "Settlement Date"
1   29999   24-MAY-24

Но я бы хотел, чтобы это выводилось так:

"COUNT" "Settlement Amount" "Settlement Date"
1   299.99  24-MAY-24

Мне было интересно, стоит ли мне использовать to_char, но, похоже, я вообще не смогу заставить запрос работать, если попробую это сделать.

возможно, это поможет: stackoverflow.com/questions/23105323/…

john Smith 24.05.2024 17:14

и если вы разделите на 100... `(SUM(STTL_AMOUNT) - SUM(CASE WHEN IS_REVERSAL =1 THEN STTL_AMOUNT ELSE 0 End))/100 Проблема не в том, что десятичные дроби не показывают, проблема, скорее всего, в вашем типе данных хранится без десятичной дроби, и вам нужно ее сдвинуть. в этом случае это должно сделать деление на 100. Хотя кажется, что нечетные суммы не будут храниться с десятичными дробями. Итак, какой тип данных представляет собой STTL_Amount? Возможно, его нужно привести к десятичной дроби с масштабом и точностью? При работе с валютой или точностью предпочтительнее использовать десятичную дробь.

xQbert 24.05.2024 17:48

ОК, вижу, что / 100 не сработало... каковы ваши настройки NLS в SQL Developer (Предполагая, что вы видите результаты в этом, или в Toad, или в аналогичном...) Это похоже на проблему с отображением при рендеринге результатов; неплохое значение, которое нужно перенастроить... Возможно, это:stackoverflow.com/questions/24571355/…

xQbert 24.05.2024 17:51

если я запускаю SQL Developer: выберите значение из nls_session_parameters, где параметр = 'NLS_NUMERIC_CHARACTERS'; я вижу ценность. , вернулся

headspace 24.05.2024 17:57
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Просто разделить на 100 и округлить, чтобы удалить ненужные 0?

SELECT COUNT (STTL_AMOUNT) as "COUNT",
       ROUND(CAST(SUM(STTL_AMOUNT) - SUM(CASE WHEN IS_REVERSAL =1 THEN STTL_AMOUNT ELSE 0 End ) AS FLOAT) / 100,2) as "Settlement Amount",
       HOST_DATE as "Settlement Date"
       FROM  OPR_OPERATION
       WHERE    MCC = '6011'
       AND      MSG_TYPE ='MSGTPRES'
       AND      HOST_DATE >= TRUNC( SYSDATE )
       GROUP BY HOST_DATE;

Спасибо, я только что попробовал это, но все равно получаю тот же результат, что и 29999, а не 299,99.

headspace 24.05.2024 17:37

Я отредактировал ответ, чтобы он был плавающим перед разделением.

patm 24.05.2024 18:53

Спасибо @patm, который теперь просто выдает мне результат как «COUNT» «Сумма расчета» «Дата расчета» 1 299 24 МАЯ 24, так что форматирование все еще не правильно.

headspace 24.05.2024 20:21
Ответ принят как подходящий

Вы сможете упростить свой запрос, поменяв местами предложения THEN и ELSE в выражении CASE и разделив на 100, чтобы:

SELECT COUNT (STTL_AMOUNT) as "COUNT",
       SUM(CASE WHEN IS_REVERSAL = 1 THEN 0 ELSE STTL_AMOUNT/100 END)
         as "Settlement Amount",
       HOST_DATE as "Settlement Date"
FROM   OPR_OPERATION
WHERE  MCC = '6011'
AND    MSG_TYPE ='MSGTPRES'
AND    HOST_DATE >= TRUNC( SYSDATE )
GROUP BY HOST_DATE;

Разделение должно иметь возможность находиться внутри или снаружи CASE или SUM:

SUM(CASE WHEN IS_REVERSAL = 1 THEN 0 ELSE STTL_AMOUNT END/100)

или

SUM(CASE WHEN IS_REVERSAL = 1 THEN 0 ELSE STTL_AMOUNT END)/100

Что для примера данных:

CREATE TABLE opr_operation (host_date, sttl_amount, is_reversal, mcc, msg_type) AS
  SELECT SYSDATE, 29999, 0, '6011', 'MSGTPRES' FROM DUAL UNION ALL
  SELECT SYSDATE - INTERVAL '1' SECOND, 20000, 0, '6011', 'MSGTPRES' FROM DUAL;

Должен ли все выводиться:

СЧИТАТЬ Сумма расчета Дата расчетов 1 299,99 2024-05-24 21:23:20 1 200 2024-05-24 21:23:19

Если вы хотите отобразить значение с двумя десятичными знаками, используйте TO_CHAR:

SELECT COUNT (STTL_AMOUNT) as "COUNT",
       TO_CHAR(
         SUM(CASE WHEN IS_REVERSAL = 1 THEN 0 ELSE STTL_AMOUNT/100 END),
         'fm99999999999999999990.00'
       ) as "Settlement Amount",
       HOST_DATE as "Settlement Date"
FROM   OPR_OPERATION
WHERE  MCC = '6011'
AND    MSG_TYPE ='MSGTPRES'
AND    HOST_DATE >= TRUNC( SYSDATE )
GROUP BY HOST_DATE;

Выходы:

СЧИТАТЬ Сумма расчета Дата расчетов 1 299,99 2024-05-24 21:23:20 1 200.00 2024-05-24 21:23:19

рабочий пример

Спасибо @MT0 — я попробовал множество вещей, включая ваше предложение выше, и это сработало, спасибо. Тем не менее, я попробовал несколько разных значений, и если я использую только 20000 в sttl_amount, он не показывает никаких десятичных знаков, когда я запускаю запрос, и просто выводит как 200, есть ли способ заставить его показывать 2 десятичных знака места будут 200.00?

headspace 24.05.2024 22:00

@headspace Обновлено, если вы хотите отформатировать значение для отображения 2d.p. тогда используй TO_CHAR.

MT0 24.05.2024 22:28

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