sql - 没有 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 );
解决方案
根据以上数据,不需要使用层次查询,可以使用下面的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;
推荐阅读
- xml - 在没有databricks的pyspark中将RDD转换为xml
- swift - 如何在不阅读文档的情况下预先获取文档数量 - Firestore - Swift
- javascript - 使用市场应用程序结帐页面反应错误
- ruby-on-rails - 为什么路由在本地工作但在heroku上部署时返回错误?
- r - 如何在 R 中将宽嵌套数据重塑为长格式?
- angular - 使用 ngIf 时 Angular Swiper 不工作
- mysql - Vue/Sequelize/Axios:删除请求:浏览器控制台显示错误请求,尽管删除确实完成了(?)
- reactjs - 在哪些情况下更新状态而不回调会导致问题?
- react-native - 如何通过 React Native Web 使用 react-navigation 设置文档标题?
- javascript - 无法将 1 个月添加到 moment.js 日期