jjzjj

「SAP ABAP」OPEN SQL(七)【GROUP BY | HAVING | ORDER BY】

ThundersArk 2023-04-14 原文

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。


💅文章概要: 各位小伙伴们大家好呀!今天继续SAP ABAP系列文章的讲解,本节带来的内容是OPEN SQL中GROUP BY语句和HAVING语句以及ORDER BY语句的介绍,希望大家喜欢!


🤟每日一言: 永远年轻,永远热泪盈眶!

目录


前言

  GROUP BY语句,HAVING语句以及ORDER BY语句在SAP ABAP中起到了关键的作用。通过上述语句可以实现对数据的分组,条件限定,排序等等,可以更加有效地帮助我们从数据库表中取到想要的数据,跟着本文的脚步,一起学习吧!


数据库表准备

  本文所有案例都是基于数据库表SFLIGHT,本案例中的SFLIGHT数据库表数据如下,供各位小伙伴们对照来观察代码运行结果:


GROUP BY语句介绍



  以下是从数据库表中读取数据并且对数据进行分组聚合的一般语法样式:

SELECT <f1>  <f2> ... <fn> <aggregate>...AS <alias>
FROM <table_name>
GROUP BY <f1> <f2>...<fn> <aggregate>
INTO [CORRESPONDING FIELDS OF TABLE] <itab>
WHERE <condition>

参数介绍:

  • <fn>: 数据库表中字段。
  • <aggregate>: 聚合函数。
  • <alias>: 聚合函数别名
  • <table_name>: 数据库表的名称。
  • <itab>:存放数据的内表。
  • <condition>:WHERE子句限定条件

 案例演示

  下面给出一段以SFLIGHT数据库表为基准的示例代码,详细讲解了ABAP OPEN SQL中如何使用GROUP BY语句对数据进行分类,仅供参考:

PS:使用GROUP BY语句的先决条件是查询数据时使用了聚合函数,聚合函数将在下面讲解;并且最好使用OPEN SQL的新语法

SELECT carrid,connid,SUM( price ) AS total_price
FROM sflight
INTO TABLE @DATA(gt_sflight)
GROUP BY carrid,connid.

LOOP AT gt_sflight INTO DATA(gs_sflight).
  WRITE: / gs_sflight-carrid,gs_sflight-connid,gs_sflight-total_price.
ENDLOOP.

  这段代码主要目的是从表 SFLIGHT中获取每个航空公司和航班连接的总价格,并将其存储在名为gt_sflight的内部表中,然后使用循环读取内部表并输出每个航空公司和航班连接的总价格。

  下面是对代码的逐段分析:

  (一)第一段代码分析

SELECT carrid, connid, SUM(price) AS total_price
FROM sflight
INTO TABLE @DATA(gt_sflight)
GROUP BY carrid, connid.

  这段代码是从表 SFLIGHT 中选择carridconnidprice列,并使用 SUM 聚合函数将每个航空公司和航班连接的价格相加。然后使用 INTO TABLE 将结果存储在名为gt_sflight的内部表中,并按照 carrid 和 connid 列进行分组

  (二)第二段代码分析

LOOP AT gt_sflight INTO DATA(gs_sflight).

  这行代码是使用LOOP AT 语句遍历 gt_sflight 内部表中的每个记录,并将每个记录存储在名为 gs_sflight 的工作区域变量中。

  (三)第三段代码分析

WRITE: / gs_sflight-carrid, gs_sflight-connid, gs_sflight-total_price.

  这行代码使用 WRITE 语句将每个记录的 carrid、connid 和 total_price 列的值输出到控制台屏幕。斜杠符号表示将每个记录的值输出到新的行


聚合函数简介


  在ABAP Open SQL中,可以使用聚合函数对数据库中的数据进行汇总和统计。

聚合函数名称功能简介
AVG取平均值
COUNT取个数
MAX取最大值
MIN取最小值
STDDEV取标准偏差
SUM取合计
  • 在使用GROUP BY语句之前,必须要先使用聚合函数对数据进行汇总和统计!
  • 聚合函数括号中的字段需要与两边的括号距离至少一个单位:
    错误写法:SUM(PRICE)
    正确写法: SUM( PRICE )

HAVING语句介绍


  HAVING语句用于在GROUP BY子句之后对聚合结果进行过滤。HAVING语句与WHERE语句非常相似,但它们用于不同的语句部分。

注意事项
HAVING语句必须跟在GROUP BY子句之后。
HAVING语句使用与WHERE语句相同的语法。
HAVING语句中的条件必须是聚合函数。


  以下是对数据分组并且对聚合结果进行过滤的一般语法样式:

SELECT <f1>  <f2> ... <fn> <aggregate>...AS <alias>
FROM <table_name>
GROUP BY <f1> <f2>...<fn> <aggregate>
HAVING <agg_condition>
INTO [CORRESPONDING FIELDS OF TABLE] <itab>
WHERE <condition>

参数介绍:

  • <fn>: 数据库表中字段。
  • <aggregate>: 聚合函数。
  • <alias>: 聚合函数别名
  • <table_name>: 数据库表的名称。
  • <agg_condition>: 聚合结果过滤条件。
  • <itab>:存放数据的内表。
  • <condition>:WHERE子句限定条件

 案例演示

  下面给出一段以SFLIGHT数据库表为基准的示例代码,详细讲解了ABAP OPEN SQL中如何使用HAVING语句对数据聚合结果进行过滤,仅供参考:

SELECT carrid,connid,SUM( price ) AS total_price
FROM sflight
INTO TABLE @DATA(gt_sflight)
      GROUP BY carrid,connid
      HAVING SUM( price ) > 1000.

LOOP AT gt_sflight INTO DATA(gs_sflight).
  WRITE: / gs_sflight-carrid,gs_sflight-connid,gs_sflight-total_price.
ENDLOOP.

  该段代码在GROUP BY语句案例演示中的的基础上增加了一个HAVING语句,过滤了total_price < 1000的数据。


ORDER BY语句介绍

  ABAP中的ORDER BY语句用于对数据库表中的数据进行排序。排序可以按照单个字段多个字段进行,可以按照升序降序排列。

  以下是对数据分组并且对聚合结果进行过滤以及最终对字段进行排序的一般语法样式:

SELECT <f1>  <f2> ... <fn> <aggregate>...AS <alias>
FROM <table_name>
GROUP BY <f1> <f2>...<fn> <aggregate>
HAVING <agg_condition>
ORDER BY <f1> <f2>...<fn> <aggregate> [ASC|DESC]
INTO [CORRESPONDING FIELDS OF TABLE] <itab>
WHERE <condition>

参数介绍:

  • <fn>: 数据库表中字段。
  • <aggregate>: 聚合函数。
  • <alias>: 聚合函数别名
  • <table_name>: 数据库表的名称。
  • <agg_condition>: 聚合结果过滤条件。
  • [ ASCENDING|DESCENDING]: 可选项:ASCENDING(默认),升序;DESCENDING,降序。
  • <itab>:存放数据的内表。
  • <condition>:WHERE子句限定条件

 单个字段排序

  下面给出一段以SFLIGHT数据库表为基准的示例代码,详细讲解了ABAP OPEN SQL中如何使用单个字段·进行排序,仅供参考:

SELECT carrid,connid,SUM( price ) AS total_price
FROM sflight
INTO TABLE @DATA(gt_sflight)
      GROUP BY carrid,connid
      HAVING SUM( price ) > 1000
      ORDER BY total_price.

LOOP AT gt_sflight INTO DATA(gs_sflight).
  WRITE: / gs_sflight-carrid,gs_sflight-connid,gs_sflight-total_price.
ENDLOOP.

  该段代码在HAVINF语句案例演示中的的基础上增加了一个ORDER BY语句,对total_price进行了升序排序。

 多个字段排序

  下面给出一段以SFLIGHT数据库表为基准的示例代码,详细讲解了ABAP OPEN SQL中如何使用多个字段·进行排序,仅供参考:

PS:如果ORDER BY语句中包含多个字段,那么排序优先级是从左往右依次递减的。也就是说,先按照第一个字段排序,如果第一个字段有相同的值,则按照第二个字段排序,以此类推。

SELECT carrid,connid,SUM( price ) AS total_price
FROM sflight
INTO TABLE @DATA(gt_sflight)
      GROUP BY carrid,connid
      HAVING SUM( price ) > 1000
      ORDER BY carrid  ASCENDING,total_price DESCENDING.

LOOP AT gt_sflight INTO DATA(gs_sflight).
  WRITE: / gs_sflight-carrid,gs_sflight-connid,gs_sflight-total_price.
ENDLOOP.

  该段代码在HAVINF语句案例演示中的的基础上增加了一个ORDER BY语句,先对carrid进行了升序排序,再对total_price进行了降序排序。

 使用ORDER BY删除数据

  除了用在SELECT语句中,ORDER BY语句还可以用在DELETE、UPDATE、INSERT等语句中。例如,可以使用ORDER BY语句删除最后一行记录

DELETE FROM sflight
ORDER BY price ASCENDING
UP TO 1 ROWS.

这段代码可以删除掉SFLIGHT数据库表中PRICE列最小的该条数据


写在最后的话

  本文花费大量时间介绍了OPEN SQL中GROUP BY语句,HAVING语句以及ORDER BY语句的详细用法,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!

原 创 不 易 , 还 希 望 各 位 大 佬 支 持 一 下 \textcolor{blue}{原创不易,还希望各位大佬支持一下}

👍 点 赞 , 你 的 认 可 是 我 创 作 的 动 力 ! \textcolor{9c81c1}{点赞,你的认可是我创作的动力!}

⭐️ 收 藏 , 你 的 青 睐 是 我 努 力 的 方 向 ! \textcolor{ed7976}{收藏,你的青睐是我努力的方向!}

✏️ 评 论 , 你 的 意 见 是 我 进 步 的 财 富 ! \textcolor{98c091}{评论,你的意见是我进步的财富!}

有关「SAP ABAP」OPEN SQL(七)【GROUP BY | HAVING | ORDER BY】的更多相关文章

  1. ruby /萨翁 : Having trouble with namespace for a soap request - 2

    我在更改正在构建的SOAPxml的命名空间时遇到问题。我不确定如何将“xmlns:env=”更改为“xmlns:soapenv=”,将“xmlns:tns=”更改为“xmlns:web=”我要构建的内容:100degreeCelsiusdegreeFahrenheit我目前得到的100degreeCelsiusdegreeFahrenheit我的代码:client=Savon.client(wsdl:"http://www.webservicex.net/ConvertTemperature.asmx?WSDL")message={temperature:'100',FromUnit:

  2. ruby - Python itertools 的 Ruby 等价物是什么,尤其是。组合/排列/groupby? - 2

    Python的itertools模块提供了很多关于使用生成器处理可迭代/迭代器的好东西。例如,permutations(range(3))-->012021102120201210combinations('ABCD',2)-->ABACADBCBDCD[list(g)fork,gingroupby('AAAABBBCCD')]-->AAAABBBCCDRuby中有哪些等价物?等效的,我的意思是快速和内存高效(Python的itertools模块是用C编写的)。 最佳答案 Array#permutation、Array#combin

  3. javascript - AngularJS 1.2 中的随机 orderBy 返回 'infdig' 错误 - 2

    在thisquestion中使用随机orderBy排序技术在AngularJS1.1中工作正常。varmyApp=angular.module('myApp',[]);functionMyCtrl($scope){$scope.list=['a','b','c','d','e','f','g'];$scope.random=function(){return0.5-Math.random();}}但是,在1.2中,它会将infdig错误放入控制台,并且需要更长的时间来返回排序结果:http://jsfiddle.net/mblase75/jVs27/控制台中的错误如下所示:Error:

  4. javascript - lodash 中的 groupBy 计数 - 2

    我有一个这样的对象数组:[{rating:1},{rating:2},{rating:3},{rating:1}]我想要这样的结果-{1:2,2:1,3:1}它将是Rating_Value:Count。我怎样才能在lodash中做到这一点?或者是否可以在没有lodash的情况下进行优化? 最佳答案 您可以使用lodash#countBy.varresult=_.countBy(data,'rating');vardata=[{rating:1},{rating:2},{rating:3},{rating:1}];varresult=

  5. javascript - 在使用 Lo-Dash 3.0 转换值时有什么好的 groupBy 方法? - 2

    给定一个像这样的对象数组:vardata=[{key:'a',val:'1'},{key:'a',val:'2'},{key:'b',val:'3'},{key:'c',val:'4'},{key:'c',val:'5'},{key:'c',val:'6'}];我想把它转换成这样:vardesiredResults={'a':[1,2],'b':[3],'c':[4,5,6]};到目前为止,我已经找到了两种使用lodash-fp实现此目的的方法,但我仍然想知道是否有更好的方法。第一种方式有点程序化:varout=_(data).transform(function(out,item){

  6. javascript - Firebase Firestore : orderBy combined with where causes error "Operation was rejected" - 2

    我正在查看FirebaseCloudFirestoredocumentation对于orderBy。当我尝试执行此操作时varfacultyQuery=facultyRef.where("department","==","CoreTeacher").orderBy('bb_last_name','desc');我得到错误:Error:Firestore:Operationwasrejectedbecausethesystemisnotinastaterequiredfortheoperation`sexecution.(firestore/failed-precondition).这

  7. javascript - 在 Javascript 中实现 GroupBy 最有效的方法是什么? - 2

    我正在尝试使用这些参数实现GroupBy方法functionGroupBy(keySelector,elementSelector,comparer){//keySelector=function(e){returne.ID}//elementSelector=function(e){returne.Name}//comparer={Equals:function(a,b){returna==b},GetHashCode:...}}但是我不知道实现它的有效方法。IcreatedajsPerftest使用linq.js和我创建的一种方法,它不使用比较器,只适用于平面类型。(Outputt

  8. javascript - 如何结合 Firestore orderBy desc 和 startAfter 游标 - 2

    我正在尝试查询firestore中的列表,该列表应按降序日期属性排序,并使用startAfter游标对结果进行分页。正如您在下面的代码片段中所看到的,一旦我将orderBy('date','desc')与startAfter(lastDoc.date)结合使用,这就会失败。我想知道我做错了什么。有什么想法吗?//thisactuallyworks//butitissortedbyascendingdatesdb.collection('tanks').doc(tankId).collection('documentations').orderBy('date').startAfter(

  9. javascript - AngularJS 中的动态 orderBy - 2

    我有一个对象数组,我想根据下拉菜单中的值动态排序。到目前为止,这是我的列表中的内容:ng-repeat="iteminfilteredItems=(items|filter:searchInput|orderBy:canBeAnything)"但问题是排序可以是对象的属性或使用函数计算的值。它还应该能够以降序方式排序(可选)。我知道我可以为orderBy后面的canByAnything变量使用字符串,传递对象的属性,例如:“-creationDate”//descendingorderingoncreationdate“customer.lastname”//ascendingorde

  10. javascript - AngularJs ng-repeat orderBy 不适用于嵌套对象属性 - 2

    我正在尝试ng-repeat嵌套对象属性并对它们进行排序,但排序对我不起作用。我看过这个:HowtoorderbyinAngularJSusingNestedproperty但是json结构不同,我无法让它工作。Plunker我的代码:{{item.name}}-{{item.order}}范围:$scope.data={"78962":{"id":"78962","name":"item2","type":"blind","order":{"allListPosition":"008","catListPosition":"059"},"data":{"status":"stop",

随机推荐