Процент на пользователя от общего числа - достигните наилучшей производительности - PullRequest
0 голосов
/ 21 января 2020

Я хочу получить процент товаров / пользователей на нашем складе (только товаров, которых нет в наличии).

item_id |  partner_id  | item_name  | stock_sum       |   manager_id   
---------------------------------------------------------------------------     
23020   |  232         |  cola      |        0        |      237             
39935   |  232         |  sprite    |        0        |       89      
23030   |  232         |  fanta     |        60       |       32    
15331   |  232         |  water     |        20       |      237

Поэтому мне нужно получить:

manager_id = 237 -> 0,25 -> 25%

manager_id = 89 -> 0,25 -> 25%

всего -> 0,50 -> 50%

My Первая идея была примерно такой:

select skk.manger_id, count(*), count(skk.item_id/sk.item_id) as prcntg
from stock skk
  inner join stock sk on skk.item_id = sk.item_id and skk.manager_id = sk.manager_id 
where skk.stock_sum = 0
group by skk.manager_id

Но я думаю, что это не правильное решение .. поэтому мне нужна помощь.

[Вывод] ожидается:

manager_id  |  total |  %  of total (prcntg)
----------------------------------------------
 237        |   0,5  |  0,25
  89        |   0,5  |  0,25 
  32        |   0,5  |     0

Ответы [ 2 ]

0 голосов
/ 21 января 2020
select manager_id, sum(av) pcnt
  from (
    select manager_id, count(case stock_sum when 0 then 1 end) / sum(count(1)) over () as av
      from stock group by manager_id)
  group by rollup(manager_id)

dbfiddle

Разделить подсчитанные нули на количество всех записей (аналитическая сумма всех подсчетов). Используйте внешний накопитель, если вам нужно общее значение.

0 голосов
/ 21 января 2020

Вы, кажется, описываете это вычисление, используя оконные функции:

select manager_id, count(*) as num_items,
       sum(case when stock_sum = 0 then 1 else 0 end) as num_out_of_stock,
       avg(case when stock_sum = 0 then 1.0 else 0 end) as manager_avg,
       sum(case when stock_sum = 0 then 1 else 0 end) / count(*) as overall_avg
from stock s
group by manager_id;

overall_avg - это то, что вы, похоже, ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...