Изменение типа данных на плавающее и округление до 2 десятичных цифр - PullRequest
1 голос
/ 30 марта 2019

Таблица:

people(id, name)
job (id, people_id, job_title, salary) 

Цель: Показать каждую уникальную работу, общая средняя зарплата (FLOAT и округлено до 2 десятичных знаков) , общая сумма человек и общая заработная плата (с плавающей запятой и округленные до 2 знаков после запятой) и порядок наивысшей средней заработной платы.

Таким образом, задача состоит в том, чтобы тип броска оставался плавающим, округляя его до 2 десятичных знаков.

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

Мои попытки :

Попытка 1:

SELECT 
  distinct(j.job_title) as job_title,
  to_char(AVG(j.salary)::FLOAT, 'FM999999990.00') as average_salary,
  COUNT(p.id) as total_people,
  CAST (SUM(j.salary) AS FLOAT) as total_salary
  FROM people p
    JOIN job j on p.id = j.people_id
  GROUP BY j.job_title
  ORDER BY total_salary

Проблема: все еще говорит, что это не поплавок

Попытка 2:

SELECT 
  distinct(j.job_title) as job_title,
  CAST (AVG(j.salary) AS FLOAT) as average_salary,
  COUNT(p.id) as total_people,
  CAST (SUM(j.salary) AS FLOAT) as total_salary
  FROM people p
    JOIN job j on p.id = j.people_id
  GROUP BY j.job_title
  ORDER BY total_salary

Проблема: не округлено до 2 десятичных знаков

Попытка 3:

SELECT 
  distinct(j.job_title) as job_title,
  ROUND (AVG(CAST(j.salary as FLOAT)), 2)) as average_salary,
  COUNT(p.id),
  ROUND (SUM(CAST(j.salary as FLOAT)), 2)) as total_salary
  FROM people p
    JOIN job j on p.id = j.people_id
  GROUP BY j.job_title
  ORDER BY total_salary

Я получаю сообщение о том, что мне нужно добавить явные типы приведения, что привело меня к попытке номер 1.

Ответы [ 2 ]

0 голосов
/ 30 марта 2019

Таким образом, задача состоит в том, чтобы тип броска оставался плавающим, округляя его до 2 десятичных знаков.

Если вы строго хотите избежать отбрасывания от float, вы можете сделать это следующим образом:

test=# 
test=# SELECT float '12.3456'
test-#      , round(float '12.3456' * 100) / 100 AS rounded
 float8  | rounded
---------+----------
 12.3456 |    12.35

Суть: round() принятие числа десятичных разрядов в качестве второго параметра основано на numeric (поскольку числа с плавающей запятой неточны по своей природе).
Но есть перегруженный вариант round(), в котором один параметр округляется до ближайшего целого числа,Умножьте на 100 до и поделите на 100 после.

Или преодолите отвращение к numeric и используйте round(numeric, int) , как указано в GMB .

Запрос

SELECT j.job_title  -- !
     , round(AVG(j.salary) * float '100') / 100 AS average_salary  -- !
     , COUNT(p.id) AS total_people
     , SUM(j.salary)::float AS total_salary  -- short cast syntax
FROM   people p
JOIN   job    j ON p.id = j.people_id
GROUP  BY j.job_title
ORDER  BY total_salary DESC NULLS LAST -- ! "order by highest average salary" 
0 голосов
/ 30 марта 2019

Ответ зависит от фактического типа данных столбца salary.Ключевым моментом является то, что round() в Postgres не позволяет float s (поддерживаются только numeric типы).

Если вы имеете дело с типом данных numeric, то вы можете сначала round(), затем приведите к float:

round(avg(salary), 2)::float

Если вы имеете дело со столбцом float, то вам нужно будет привести результат статистической функции перед использованием round():

round(avg(salary)::numeric, 2)::float
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...