sql—我需要oracle查询,只有当某个产品的销售额高于上个月时,才能获取该产品的销售额

iqxoj9l9  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(442)

例子:

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

mm5n2pyu1#

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

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<>在这里摆弄

vatpfxk5

vatpfxk52#

我需要oraclequery来获取一个产品的销售额,只要它比上个月的销售额大
如果您的数据分布超过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

相关问题