【问题标题】:I need Oracle query to get sales of a product only if its greater than its previous month仅当产品大于上个月时,我才需要 Oracle 查询以获取产品的销售额
【发布时间】:2020-06-13 19:44:33
【问题描述】:

例子:

PROD_ID SALES DATE
1       400   12-APR-2020
1       300   20-apr-2020
2       300   23-MAY-2020
2       300   20-may-2020

结果应该是

1 700

prod id 应该在 5 月和 4 月之间进行比较,并显示两个月之间的最大值。

【问题讨论】:

  • 样本数据有问题。如果两个日期都在 4 月,我们如何比较 PROD_ID = 1(或 2,相同的东西)在 4 月和 5 月之间?

标签: sql oracle group-by sum window-functions


【解决方案1】:

按月份分组,然后找到第一行。

SELECT prod_id,
       SUM( SALES ) AS total_sales
FROM   table_name
GROUP BY prod_id, TRUNC( "DATE", 'MM' )
ORDER BY total_sales DESC
FETCH FIRST ROW ONLY;

或:

SELECT PROD_ID,
       total_sales
FROM   (
  SELECT prod_id,
         SUM( SALES ) AS total_sales,
         RANK() OVER ( ORDER BY SUM( SALES ) DESC ) AS rnk
  FROM   table_name
  GROUP BY prod_id, TRUNC( "DATE", 'MM' )
)
WHERE  rnk = 1

其中,对于您的示例数据:

CREATE TABLE table_name ( PROD_ID, SALES, "DATE" ) AS
SELECT 1, 400, DATE '2020-04-20' FROM DUAL UNION ALL
SELECT 1, 300, DATE '2020-04-23' FROM DUAL UNION ALL
SELECT 2, 300, DATE '2020-05-23' FROM DUAL UNION ALL
SELECT 2, 300, DATE '2020-05-20' FROM DUAL;

两个输出:

PROD_ID |总销售额 ------: | ----------: 1 | 700

db小提琴here

【讨论】:

    【解决方案2】:

    我需要 Oracle 查询来获取产品的销售额,前提是它比上个月大

    如果您的数据分布超过 2 个月,那么我建议聚合和lag()

    select *
    from (
        select
            prod_id,
            trunc(sales_date, 'mm') sales_month,
            sum(sales) total_sales,
            lag(sum(sales)) over(partition by prod_id order by trunc(sales_date, 'mm')) lag_total_sales
        from mytable 
        group by prod_id, trunc(sales_date, 'mm')
    ) t
    where total_sales > lag_total_sales
    

    子查询计算每个产品和每个月的总销售额,并使用lag() 检索上个月的总销售额。然后,外部查询过滤月销售额大于上个月的产品/月元组。

    您可能希望准确定义产品的第一个销售月应如何处理。上面的查询会将其过滤掉(因为没有“上一个”月份)。如果要在结果集中保留它,可以将where 子句更改为:

    where lag_total_sales is null or total_sales > lag_total_sales
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      相关资源
      最近更新 更多