首页 > 解决方案 > 没有 ID 关系的分层数据的 SUM 和 COUNT

问题描述

我有一张桌子,上面有物品、年/月格式的日期以及在特定月份和年份出售的每件物品的数量。

有几个项目,但其中一些项目之间也有关系。有关系的项目具有相同的 3 个字符示例:101 是基本版本中的项目 1,然后是市场上的新版本 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' , '101' , 10 );
insert into items values ( '201903' , '101' , 10 );
insert into items values ( '201904' , '101' , 10 );
insert into items values ( '201905' , '101' , 10 );
insert into items values ( '201906' , '101' , 10 );
insert into items values ( '201907' , '101' , 10 );
insert into items values ( '201908' , '101' , 10 );
insert into items values ( '201909' , '101' , 10 );
insert into items values ( '201910' , '101' , 10 );
insert into items values ( '201911' , '101' , 10 );
insert into items values ( '201912' , '101' , 10 );
insert into items values ( '202001' , '101' , 10 );
insert into items values ( '202002' , '101' , 10 );
insert into items values ( '202003' , '101' , 10 );
insert into items values ( '202004' , '101AA' , 10 );
insert into items values ( '202005' , '101AA' , 10 );
insert into items values ( '202006' , '101AA' , 10 );
insert into items values ( '202007' , '101AA' , 10 );
insert into items values ( '202008' , '101AA' , 10 );
insert into items values ( '202009' , '101AA' , 10 );
insert into items values ( '202010' , '101AA' , 10 );
insert into items values ( '202011' , '101AB' , 10 );
insert into items values ( '202012' , '101AB' , 10 );
insert into items values ( '202101' , '101AB' , 10 );
insert into items values ( '202102' , '101AB' , 10 );
insert into items values ( '202004' , '200A' , 5 );
insert into items values ( '202005' , '200A' , 5 );
insert into items values ( '202006' , '200A' , 5 );
insert into items values ( '202007' , '200A' , 5 );
insert into items values ( '202008' , '200AC' , 10 );
insert into items values ( '202009' , '200AC' , 10 );
insert into items values ( '202010' , '200AC' , 10 );
insert into items values ( '202011' , '200AC' , 10 );
insert into items values ( '202011' , '200DD' , 10 );
insert into items values ( '202012' , '200AC' , 10 );
insert into items values ( '202012' , '200DD' , 25 );
insert into items values ( '202101' , '200AC' , 10 );
insert into items values ( '202101' , '200DD' , 25 );
insert into items values ( '202102' , '200AC' , 10 );
insert into items values ( '202102' , '200DD' , 25 );
insert into items values ( '202011' , '400' , 50 );
insert into items values ( '202011' , '400AA' , 10 );
insert into items values ( '202012' , '400AA' , 50 );
insert into items values ( '202012' , '400AA' , 25 );

标签: sqloracle12chierarchical

解决方案


根据以上数据,不需要使用层次查询,可以使用下面的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,1,3)) as ITEM_CODE_First,amount from items)
where YEARMONTH_LAST = 202102
group by ITEM_CODE_First;

推荐阅读