【问题标题】:SQL - Dividing aggregated fields, very new to SQLSQL - 划分聚合字段,对 SQL 来说非常新
【发布时间】:2020-02-18 23:16:49
【问题描述】:

我有来自发票的行项目列表,其中包含一个字段,该字段指示行是已交付还是已取件。我需要从总行数中找到交付项目的百分比。

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;

我的查询执行但由于某种原因从未完成。有没有更简单的方法来做到这一点?履行字段不包含任何 NULL 值。

任何帮助将不胜感激。

【问题讨论】:

  • 样本数据和期望的结果会有所帮助。
  • 小心整数除法。
  • 期望的结果将是一个包含字段 sales_nbr、total、deliveryrate(百分比)的表格,例如12345, 1000, 0.10 (10%)

标签: sql field division


【解决方案1】:

我需要从总行数中找出交付项目的百分比。

最简单的方法是使用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 bysales_nbr。

【讨论】:

  • 这是我需要的。我从没想过 avg(fulfillment),因为我们正在查看 1 和 0,它有效吗?
  • @BlueTorq 。 . .在某些数据库中,您需要avg(fulfillment * 1.0),因为它们会进行整数平均。但是,是的,如果您有 0/1 标志列,这在任何数据库中都是一个方便的快捷方式。
【解决方案2】:

如果你想得到一个“不错”的查询,你可以使用这样的子查询:

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

【讨论】:

  • 它执行了!然而,Scanrate 只返回 1 或 0。除法没有正确发生,或者它没有格式化为小数给我们一个百分比。您知道如何将 Deliveryrate 字段格式化为小数吗?
猜你喜欢
  • 2021-04-12
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 2015-02-20
  • 2017-03-12
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
相关资源
最近更新 更多