mysql процент 2 знака после запятой - PullRequest
0 голосов
/ 23 декабря 2018

С помощью следующего кода MYSQL я пытаюсь округлить свои проценты до 2 десятичных разрядов, я пробовал усекать и округлять, но когда я добавляю все проценты из моего вывода, я не получаю 100%, получая числа, такие как 99,9%, 99,95% etc

Пожалуйста, посмотрите мой обновленный полный запрос, чтобы также показать счетчики каждого типа, процент без округления и процент с округлением:

select
bondtype,
count(distinct secid) AS Count,
concat(count(distinct secid)/(select count(distinct secid) from wca.bond)*100, '%') as Percentage,
concat(ROUND(count(distinct secid)/(select count(distinct secid) from wca.bond)*100, 2), '%') as Percentage_with_Rounding
from wca.bond
group by bondtype;

Вот вывод, который я получаю:

enter image description here

Notice Percentage_with_Rounding для CS типа облигации должен составлять 0,05%, а не 0,04%, все остальные показатели выглядят правильными после округления, но только этот, который я нахожу странным.Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Вы не рассчитываете процент «сбалансированным» способом, значения, полученные следующим образом:

select secidtype, count(DISTINCT secid) from WCA.BOND group by secidtype

может быть больше или меньше, чем число из другой таблицы:

select count(distinct secid) from SECURITIES

Вы можете иметь миллионы в одной таблице, и только несколько в другой, просто нет гарантии, что такой набор процентов добавится к 100. Вот пример:

CREATE TABLE bond(
   secid INTEGER  NOT NULL PRIMARY KEY 
   , secidtype integer
);
INSERT INTO bond(secid) 
VALUES 
  (1)
, (2)
, (3)
, (4)
, (5)
, (6)
, (7)
, (8)
, (9)
, (10)
;
CREATE TABLE securities(
   secid INTEGER  NOT NULL PRIMARY KEY 
);
INSERT INTO securities(secid)
VALUES 
  (1)
, (2)
, (3)
;
SELECT 
  coalesce(secidtype,1) secidtype
, count(DISTINCT secid) num_of
, (SELECT count(DISTINCT secid)  FROM securities) other_table
, TRUNCATE (
  CONCAT (
   count(DISTINCT secid) / (
    SELECT count(DISTINCT secid)
    FROM securities
    ) * 100
   , '%'
   )
  , 2
  ) AS Percentage
FROM bond
GROUP BY coalesce(secidtype,1);
secidtype | num_of | other_table | Percentage
--------: | -----: | ----------: | ---------:
        1 |     10 |           3 |     333.33

дБ <> скрипка здесь

0 голосов
/ 23 декабря 2018

как этот выбор приведения (раунд (((1 * 100.0) / 9), 2) как десятичное число (5,2))

выбор типа secidtype, ROUND (усечение (concat (число (отличный secid))/ (выберите количество (отличный secid) из ценных бумаг) * 100.0), 2)) в процентах от группы wca.bond по secidtype;

...