Я создал запрос выбора, который использует функцию 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, но, похоже, я вообще не смогу заставить запрос работать, если попробую это сделать.
и если вы разделите на 100... `(SUM(STTL_AMOUNT) - SUM(CASE WHEN IS_REVERSAL =1 THEN STTL_AMOUNT ELSE 0 End))/100 Проблема не в том, что десятичные дроби не показывают, проблема, скорее всего, в вашем типе данных хранится без десятичной дроби, и вам нужно ее сдвинуть. в этом случае это должно сделать деление на 100. Хотя кажется, что нечетные суммы не будут храниться с десятичными дробями. Итак, какой тип данных представляет собой STTL_Amount? Возможно, его нужно привести к десятичной дроби с масштабом и точностью? При работе с валютой или точностью предпочтительнее использовать десятичную дробь.
ОК, вижу, что / 100 не сработало... каковы ваши настройки NLS в SQL Developer (Предполагая, что вы видите результаты в этом, или в Toad, или в аналогичном...) Это похоже на проблему с отображением при рендеринге результатов; неплохое значение, которое нужно перенастроить... Возможно, это:stackoverflow.com/questions/24571355/…
если я запускаю SQL Developer: выберите значение из nls_session_parameters, где параметр = 'NLS_NUMERIC_CHARACTERS'; я вижу ценность. , вернулся


Просто разделить на 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.
Я отредактировал ответ, чтобы он был плавающим перед разделением.
Спасибо @patm, который теперь просто выдает мне результат как «COUNT» «Сумма расчета» «Дата расчета» 1 299 24 МАЯ 24, так что форматирование все еще не правильно.
Вы сможете упростить свой запрос, поменяв местами предложения 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;
Должен ли все выводиться:
Если вы хотите отобразить значение с двумя десятичными знаками, используйте 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;
Выходы:
Спасибо @MT0 — я попробовал множество вещей, включая ваше предложение выше, и это сработало, спасибо. Тем не менее, я попробовал несколько разных значений, и если я использую только 20000 в sttl_amount, он не показывает никаких десятичных знаков, когда я запускаю запрос, и просто выводит как 200, есть ли способ заставить его показывать 2 десятичных знака места будут 200.00?
@headspace Обновлено, если вы хотите отформатировать значение для отображения 2d.p. тогда используй TO_CHAR.
возможно, это поможет: stackoverflow.com/questions/23105323/…