рассчитать процентный вклад каждой группы на основе определенного условия SQL - PullRequest
0 голосов
/ 29 мая 2018

Я хотел бы рассчитать процент взноса «Количество» для 2 групп, группы 1, где «Идентификатор клиента» появлялся более одного раза, и группы 2, где «Идентификатор клиента» - один раз.Например:

|ID | OrderID   |Quantity
|---|--------   |-----
|1  |10248      |12
|2  |10248      |10 
|3  |10248      |5 
|4  |10249      |9
|5  |10249      |40
|6  |10250      |10

----- в -----

OrderID |Quantity
10248   |27
10249   |49
10250   |10

----- в конечном итоге в -----

Group    % tot Quantity
1         12%   <--- Just OrderID 10250 since it has only 1 order
2         88%

Ответы [ 4 ]

0 голосов
/ 29 мая 2018

Другие ответы помещают значения в одну строку, но ОП запрашивает две строки.Если это важно:

select (case when cnt = 1 then 1 else 2 end) as grp,
       qty / totQty as ratio
from (select OrderID, sum(Quantity) as Qty, count(*) as cnt
      from myTable
      group by OrderId
     ) o cross join
     (select sum(Quantity) as totQty from myTable) x
group by (case when cnt = 1 then 1 else 2 end);
0 голосов
/ 29 мая 2018

Может быть, это поможет. В противном случае, пожалуйста, сообщите мне.

select a.OrderID,a.grp, Cast(Cast(a.Quantity*100 as decimal(18,2)) as varchar(100)) + ' %' as Percentage from (
select OrderID as OrderID,count(OrderID) as grp,Sum(Quantity) as Quantity  from myTable
group by OrderID
) as a
0 голосов
/ 29 мая 2018

Предыдущий ответ не работает, он отвечает 33% Эта работа отлично:

select 100.0 * sum(case when cnt = 1  then sumQty else 0 end) / sum(sumQty) as 'single Order'
,100.0 * sum(case when cnt <> 1 then sumQty else 0 end) / sum(sumQty) as 'multiple Order'
from
 (
select 
   OrderID
  ,sum(Quantity) as sumQty -- not needed for the final result
  ,count(*) as cnt
from _ds_test_ac
group by OrderId
) as dt

Если вы хотите в две строки, вы можете сделать:

select cnt = 1 as 'IS Single',   100.0 * sum(sumQty) / tot as 'percent'
from
 (
    select 
       OrderID
      ,sum(Quantity) as sumQty -- not needed for the final result
      ,count(*) as cnt
    from _ds_test_ac
    group by OrderId
 ) as dt join 
 (
 select sum(Quantity) as tot
    from _ds_test_ac
 ) dtot 
group by 1
0 голосов
/ 29 мая 2018
select
   100.0 * sum(case when cnt = 1  then sumQty else 0 end) / sum(sumQty) as "single Order"
  ,100.0 * sum(case when cnt <> 1 then sumQty else 0 end) / sum(sumQty) as "multiple Orders"
from
 (
    select 
       OrderID
      ,sum(Quantity) as sumQty
      ,count(*) as cnt
    from myTable
    group by OrderId
 ) as dt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...