没有 ID 关系的分层数据类型的 SUM 和 COUNT

问题描述

我有一张表,上面有项目、年/月格式的日期以及在特定月份和年份销售的每件商品的数量

有几个项目,但其中一些项目之间也有关系。 具有关系的项目具有相同的 3 个字符 例如:101 是基本版本中的 item1,然后是市场上的新版本 101AA 和后来的 101AB,它仍在市场上 = 年月 202102。 该物品并不总是需要带有基本版本(仅限 3 个字符),但它可以从最高的一个开始 = 物品 200A。后来又出现了新版本 200AC 和 200DD,正如你所看到的,到目前为止,市场上可能同时有 2 个版本。

我需要的是显示特定项目的第一个版本,在市场上花费的总月数(所有版本一起)和总金额(所有版本一起)仅用于那些仍然存在于市场上的项目。它就像与部门经理的层级查询及其员工 + 所有工资。 最后一件 400AA 已于 2020 年 12 月售罄,因此不符合条件。

所需的输出应如下所示。

Item       months      total
101         26          260
200A        11          175




create table items (
yearmonth varchar2(6),item_code varchar2(12),amount number        );

insert into items values ( '201901','101',10 );
insert into items values ( '201902',10 );
insert into items values ( '201903',10 );
insert into items values ( '201904',10 );
insert into items values ( '201905',10 );
insert into items values ( '201906',10 );
insert into items values ( '201907',10 );
insert into items values ( '201908',10 );
insert into items values ( '201909',10 );
insert into items values ( '201910',10 );
insert into items values ( '201911',10 );
insert into items values ( '201912',10 );
insert into items values ( '202001',10 );
insert into items values ( '202002',10 );
insert into items values ( '202003',10 );
insert into items values ( '202004','101AA',10 );
insert into items values ( '202005',10 );
insert into items values ( '202006',10 );
insert into items values ( '202007',10 );
insert into items values ( '202008',10 );
insert into items values ( '202009',10 );
insert into items values ( '202010',10 );
insert into items values ( '202011','101AB',10 );
insert into items values ( '202012',10 );
insert into items values ( '202101',10 );
insert into items values ( '202102','200A',5 );
insert into items values ( '202005',5 );
insert into items values ( '202006',5 );
insert into items values ( '202007',5 );
insert into items values ( '202008','200AC','200DD',25 );
insert into items values ( '202101',25 );
insert into items values ( '202102',25 );
insert into items values ( '202011','400',50 );
insert into items values ( '202011','400AA',50 );
insert into items values ( '202012',25 );

解决方法

基于上面的数据,不需要使用层次查询,可以使用下面的sql:

select ITEM_CODE_First,count(distinct YEARMONTH),sum(amount) total from(
select YEARMONTH,max(YEARMONTH)over (partition by substr(item_code,1,3)) as YEARMONTH_LAST,ITEM_CODE,min(ITEM_CODE) over (partition by substr(item_code,3)) as ITEM_CODE_First,amount from items)
where YEARMONTH_LAST = 202102
group by ITEM_CODE_First;