SQL процент не достигает 100% - PullRequest
1 голос
/ 04 февраля 2020

Здравствуйте, извините за плохой английский sh или что-то еще.

У меня есть небольшая проблема в моем запросе SQL, если у меня была таблица, подобная этой


item amount itemtype sumamount percentage
1     100       1      300        0,33
2     100       2      300        0,33
3     100       3      300        0,33
with s as (
select itemtype, sum(amount) as sum
from test3
group by itemtype)

x as (
select s.*, amount/sum as persen from test3 t inner join s on t.itemtype = s.itemtype)
select sum(persen) from x 

и Я ищу сумму в процентах, которая не заканчивается как 100%, как решить эту проблему? спасибо

Ответы [ 3 ]

0 голосов
/ 04 февраля 2020

Если мы начнем отсюда:

with s as ( select itemtype, sum(amount) as sum_c
            from test3
           group by itemtype),
x as ( select s.*, amount/sum_c as persen 
       from test3 t 
       inner join s on t.itemtype = s.itemtype)
select sum(persen) from x;

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

Это возвращает число 3 из вашего примера, и ваш вопрос: "SQL процент не достигает 100% ". Так что не совсем понятно, что вы хотите здесь выполнить ...

Ваш первый запрос будет повторен:

itemtype  sum_c
       1  100
       2  100
       3  100

Что логично, когда вы группируете по типу элемента .

Во втором запросе вы делите результат sum_c на сумму, равную 100/100, и получается:

itemtype  sum_c   persen
       1    100        1
       2    100        1
       3    100        1

Итак, Пожалуйста, обновите ваш вопрос с результатом, который вы хотите получить из данных этого примера.

Вот пример вашего примера: https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=fd6244948053822b1f339d7939ef7723 Возможно, это поможет вам или, возможно, другим дать вам решение ...

0 голосов
/ 04 февраля 2020

Простое решение - сохранить больше десятичных знаков и не беспокоиться о разнице. Ваш запрос выглядит более просто:

select t3.*,
       amount * 1.0 / sum(amount) over (partition by itemtype) as ratio
from test3 t3;

Это должно вернуть результаты, например, 0.3333333. Если вы действительно хотите, чтобы одно значение слегка отклонилось, сделайте сумму 100%. Затем вы можете сделать некоторые манипуляции и арифметические c:

select t3.*,
       (case when row_number() over (partition by itemtype order by item) = 1
             then (sum(ratio) over (partition by itemtype order by item) - ratio)
             else ratio
        end) as ratio
from (select t3.*,
             convert(decimal(10, 4), amount * 1.0 / sum(amount) over (partition by itemtype)) as ratio
      from test3 t3
     ) t3;

Дополнительная арифметическая c гарантирует, что значение увеличивается до 1.

0 голосов
/ 04 февраля 2020

Поскольку вы делите 2 числа, они могут не округляться до точного числа. Например, 1/3 - это 0,33333333 ... до конца времени, но это не может быть сохранено в компьютерной системе, поэтому нам нужно где-то округлить их. Вы можете повысить точность вычисления, приведя сумму к другому типу чисел, например, действительному.

with s as (
select itemtype, sum(amount) as sum
from test3
group by itemtype)

x as (
select s.*, CAST(amount as real)/sum as persen from test3 t inner join s on t.itemtype = s.itemtype)
select sum(persen) from x 
...