别再写循环了!ABAP SQL聚合函数COUNT/AVG/MAX实战指南,5分钟搞定数据统计
ABAP SQL聚合函数实战告别低效循环5分钟掌握高阶统计技巧每次看到ABAP报表里那些嵌套三层的LOOP和SORT语句我的血压就会悄悄升高。上周review同事代码时发现一个统计物料库存的报表竟然用了三个嵌套循环——外层遍历工厂、中层遍历库存类型、内层遍历物料批次最后还要SORT BY和READ TABLE取最大值。这种写法不仅让300行的数据统计跑了足足2秒更让后续维护的同事看得一头雾水。1. 为什么SQL聚合函数是ABAP开发者的必备技能十年前我刚接触ABAP时导师就告诉我能用SQL解决的绝不用ABAP逻辑处理。当时SAP HANA还没普及这个建议主要基于代码可读性考虑。但在今天S/4HANA时代这个原则已经关乎系统性能生死——内存计算引擎对SQL聚合的优化远超过程式代码。传统循环统计的三大痛点性能黑洞每次LOOP都在消耗CPI资源嵌套循环更是O(n²)复杂度可读性灾难SORTREAD TABLE模式让业务逻辑支离破碎维护噩梦新增统计维度需要重构整个循环结构 反面教材传统循环统计方式 LOOP AT lt_stock INTO ls_stock WHERE werks 1000. lv_total lv_total ls_stock-menge. ENDLOOP. 现代方案一行SQL搞定 SELECT SUM( menge ) FROM mard INTO lv_total WHERE werks 1000.2. 基础聚合函数实战从COUNT到MAX2.1 COUNT不只是计数那么简单COUNT(*)与COUNT(字段)有本质区别COUNT(*)统计所有行数包含NULL值COUNT( field )只统计该字段非NULL的行数 统计供应商数量包含重复 SELECT COUNT( * ) FROM lfa1 INTO DATA(lv_count). 统计唯一国家代码数量 SELECT COUNT( DISTINCT land1 ) FROM lfa1 INTO DATA(lv_country_num).提示在S/4HANA中COUNT(DISTINCT)性能已大幅优化可放心使用2.2 AVG小心NULL值的陷阱计算平均值时NULL值会被自动排除这可能影响业务逻辑 计算物料平均价格自动跳过价格为0的记录 SELECT AVG( dmbtr ) FROM ekpo INTO DATA(lv_avg_price) WHERE werks 1000 AND matnr MAT-001.如果需要包含0值应该先使用COALESCE处理SELECT AVG( COALESCE( dmbtr, 0 ) ) FROM ekpo INTO lv_avg_price...2.3 MAX/MIN性能碾压SORTREAD对比三种取最大值的方法方法执行时间(ms)代码行数内存消耗SORTREAD TABLE1205高UP TO 1 ROWS451中MAX聚合函数81低 最优方案获取最近采购订单日期 SELECT MAX( budat ) FROM ekko INTO DATA(lv_max_date) WHERE lifnr lv_vendor.3. 高阶组合应用GROUP BY的魔法3.1 多维度统计一行顶十行传统方式需要多层循环实现的统计用GROUP BY只需一行TYPES: BEGIN OF ty_stats, werks TYPE mard-werks, lgort TYPE mard-lgort, total TYPE mard-labst, END OF ty_stats. DATA(lt_stats) VALUE ty_stats_table( ). 按工厂和库存地点统计总库存 SELECT werks, lgort, SUM( labst ) AS total FROM mard INTO TABLE lt_stats GROUP BY werks, lgort.3.2 HAVING聚合后的过滤WHERE在聚合前过滤HAVING在聚合后过滤 找出库存总量超过1000的物料 SELECT matnr, SUM( labst ) AS total FROM mard INTO TABLE DATA(lt_materials) WHERE werks 1000 GROUP BY matnr HAVING SUM( labst ) 1000.4. 实战优化从能用走向好用4.1 避免全表扫描的索引技巧聚合字段顺序影响性能 较差第二个GROUP BY字段无索引 SELECT werks, matnr, SUM( menge ) FROM mard GROUP BY werks, matnr. 假设matnr无索引 优化调整字段顺序 SELECT matnr, werks, SUM( menge ) FROM mard GROUP BY matnr, werks. matnr在前4.2 CDS视图中的聚合计算现代ABAP开发应该优先使用CDSAbapCatalog.sqlViewName: ZMATERIALSTATS define view Z_Material_Stats as select from mard { key werks, key matnr, sum( labst ) as total_stock, avg( labst ) as avg_stock } group by werks, matnr4.3 调试技巧查看执行的SQL使用CL_SQL_STATEMENT查看最终生成的SQLDATA(lo_stmt) NEW cl_sql_statement( ). lo_stmt-get_statement_for_cursor( EXPORTING cursor lo_stmt-execute_query( SELECT... ) IMPORTING statement DATA(lv_sql) ).记得第一次用MAX聚合函数重构那个库存报表后原本2秒的查询降到了200毫秒。项目经理盯着结果看了半天最后只说了一句早该这么写。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2605031.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!