SQL - Разделение агрегированных полей, очень новое для SQL - PullRequest
1 голос
/ 19 февраля 2020

У меня есть список позиций из счетов-фактур с полем, которое указывает, была ли линия доставлена ​​или получена. Мне нужно найти процент доставленных предметов от общего количества строк.

SALES_NBR | Всего | Скорость доставки

1 = Доставлено 0 = забрано из FULFILLMENT.

SELECT SALES_NBR, 
COUNT (ITEMS) as Total, 
SUM (case when FULFILLMENT = '1' then 1 else 0 end) as delivered,
(SELECT delivered/total) as Deliveryrate
FROM Invoice_table
WHERE STORE IN '0123'
And SALE_DATE >='2020-02-01'
And SALE_DATE <='2020-02-07'
Group By SALES_NBR, Deliveryrate;

Мой запрос выполняется, но по какой-то причине не завершается. Есть ли более простой способ сделать это? Поле Fulfillment не содержит значений NULL.

Любая помощь приветствуется.

Ответы [ 2 ]

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

Мне нужно найти процент доставленных предметов от общего числа строк.

Самый простой способ - использовать avg():

select SALES_NBR, 
       avg(fulfillment) as delivered_ratio
from Invoice_table
where STORE = '0123' and
      SALE_DATE >='2020-02-01' and
      SALE_DATE <='2020-02-07'
group by SALES_NBR;

Я не уверен, нужен ли group by sales_nbr.

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

Если вы хотите получить «хороший» запрос, вы можете использовать такие подзапросы, как этот:

select
  qry.*,
  qry.delivered/qry.total as Deliveryrate
from (
  select 
    SALES_NBR, 
    count(ITEMS) as Total, 
    sum(case when FULFILLMENT = '1' then 1 else 0 end) as delivered
  from Invoice_table
  where STORE IN '0123'
    and SALE_DATE >='2020-02-01'
    and SALE_DATE <='2020-02-07'
  group by SALES_NBR
  ) qry;

Но я думаю, что этот, даже более уродливый, может работать быстрее:

  select 
    SALES_NBR, 
    count(ITEMS) as Total, 
    sum(case when FULFILLMENT = '1' then 1 else 0 end) as delivered,
    sum(case when FULFILLMENT = '1' then 1 else 0 end)/count(ITEMS) as Deliveryrate
  from Invoice_table
  where STORE IN '0123'
    and SALE_DATE >='2020-02-01'
    and SALE_DATE <='2020-02-07'
  group by SALES_NBR
...