как получить десятичные дроби, только если число не является круглым в mysql

#mysql #formatting

#mysql #форматирование

Вопрос:

Я пытаюсь получить число, отформатированное как имеющее 2 десятичных знака, если число не является целым числом, и не имеющее ни одного, если число является целым числом. В настоящее время я использую следующий запрос

 SELECT round(SUM(number),2) as Numb FROM table
  

И я получаю числа типа 1.00, которые я бы хотел, чтобы это было 1

Комментарии:

1. Вчера я видел подобный вопрос, и мне кажется, что эти вопросы непродуманны — они спрашивают, как сделать что-то, чего в большинстве случаев делать не следует. Если число хранится в виде числового типа с дробным компонентом, то оно хранится таким образом, вероятно, потому, что существует неявное ограничение на точность измерения. Отображение соответствующих десятичных разрядов сохраняет этот сигнал относительно точности значения. Кроме того, если вы сравните выходные данные этой процедуры для запросов, которые выдали целое число, и запросов, которые этого не сделали, это будет выглядеть уродливо и непоследовательно.

2. @Hammerite Позволю себе не согласиться. Я сейчас изучаю это, и моим вариантом использования является столбец «сумма» в системе закупок. Я хочу, например, иметь возможность приобрести 5 предметов или 2,4 метра чего-либо. При покупке товаров десятичные дроби совершенно не нужны.

Ответ №1:

Вам придется использовать регистр с модулем. Что-то вроде:

 select 
case (number mod 1 > 0)
  when true then round(number, 2)
  else round(number, 0)
end
from Numb
  

Результаты:

 select  
case (number mod 1 > 0)  
  when true then round(number, 2)   
  else round(number,0) 
end as num 
from Numb;

 ------ 
| num  |
 ------ 
|    2 |
| 1.01 |
|    5 |
| 3.01 |
| 4.25 |
 ------ 
5 rows in set (0.00 sec)
  

Комментарии:

1. как так? Приведенный выше запрос выбирает все строки из Numb. Я провел небольшой тест и получил результаты в нескольких строках

2. Это запрос, который я использую ‘ВЫБЕРИТЕ case (SUM(WorkedHours) mod 1 > 0) при значении true, затем round (SUM(WorkedHours), 2) else round (SUM(WorkedHours), 0)end КАК TotalWorkedHours ИЗ timetrack.work_items с ВНУТРЕННИМ СОЕДИНЕНИЕМ timetrack.time_logs t на w.ID = t.IDWorkItem group по IDSottocommessa’ и я получаю [TotalWorkedHours,46.19,10.00,30.00,25.00,12.00]