我需要 Oracle 查询来获取仅当产品大于上个月的产品销售额时



示例:

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 月的销售之间进行比较,并显示两个月之间的最大值。

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

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 |TOTAL_SALES ------: |----------: 1 |        700

db<>在这里小提琴

我需要 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

最新更新