SQL:为每个产品选择最新销售

问题描述 投票:0回答:2

我要问你一个困扰我一段时间的问题。

我有这个数据库,注册一个商店的每笔交易,列如下:

SALES_table

产品代码对于每个商品都是唯一的(基本上是条形码),我想为查询中提供的每个product_code提取最新销售,因此,我们有“ P914”,“ P959”和“输入为“ P953”,输出应为:

Wished_result

因此,我一直在尝试两种方法来获得此结果,第一种方法是使用简单的max()函数并通过group by:

select SALE_ID, max(DATE_OF_SALE) as DATE_MAX, PRODUCT_CODE, VENDOR
from SALES
where PRODUCT_CODE in ('P914', 'P953', 'P959')
and DATE_OF_SALE is not null
group by SALE_ID, VENDOR, CODE_AP
order by DATE_MAX desc;

我试图通过第二个选择来限制DATE_OF_SALE的第二种方法:

select t1.SALE_ID, t1.DATE_OF_SALE, t1.PRODUCT_CODE, t1.VENDOR
from SALES t1
where t1.PRODUCT_CODE in ('P914', 'P953', 'P959')
and t1.DATE_OF_SALE = (select max(t2.DATE_OF_SALE) from SALES t2 where t2.SALE_ID = t1.SALE_ID group by code_ap)
order by d_realisation desc;

两个查询都给出完全相同的结果:

Current_result

我真的无法捕捉到我在做错什么,以及如何正确地做。如果有人可以帮助我,我将不胜感激

谢谢大家阅读!

sql oracle
2个回答
0
投票

您按sale_id +供应商+代码分组,因此您将获得每个sale / vendor / code组合的最后一条记录,而不是每个sale_id的最后一条记录。

修复,仅按产品代码分组:

假设ID与您的示例中的sale_dates顺序相同:

select * from sales 
where sale_id in (
  select max(sale_id) 
  from sales
  group by (product_code)
)

0
投票

您第二次使用相关子查询进行过滤的尝试几乎就在那里。您只需要按product_code进行关联并从子查询中删除group by子句:

select s.*
from sales s
where product_code in ('P914', 'P953', 'P959')
and s.date_of_sale = (
    select max(s1.date_of_sale) 
    from sales s1
    where s1.product_code = s.product_code
)
© www.soinside.com 2019 - 2024. All rights reserved.