HANA客户账龄报告

2020-09-27 19:54发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

由于要添加150天和180天的列,因此我试图在HANA中重新创建"客户老化报告",但是在日期计算方面遇到了困难。

请参见下面的代码:


 选择OCRD。" CardCode" AS"客户代码",OCRD。" CardName" AS"客户名称",SUM(
     案件
         当" SYSCred" <> 0时" SYSCred" * -1
         ELSE" SYSDeb"
     END)AS"余额到期",IFNULL(SUM(
     案件
         当DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))<0 THEN
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" Future Remit",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))> = 0并且
          DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))<30)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 0-30天",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))> = 30并且
          DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))<60)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 31至60天",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))> = 60并且
          DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))<90)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 61至90天",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))> = 90并且
          DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))<120)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 91至120天",IFNULL(SUM(
     案件
         当DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))> = 120 THEN
         案件
             当" BalDueCred" <> 0时" BalDueCred" * -1
             其他" BalDueDeb"
         结束
     END),0.00)AS" 120+天"
 从JDT1,
     OCRD
 在JDT1。" ShortName" = OCRD。" CardCode"和OCRD。" CardType" ='c'
 OCRD的GROUP。" CardCode",OCRD。" CardName" HAVING SUM(
 案件
     当" SYSCred" <> 0时" SYSCred" * -1
     ELSE" SYSDeb"
 END)> 0 OR SUM(
 案件
     当" SYSCred" <> 0时" SYSCred" * -1
     ELSE" SYSDeb"
 结束)<0
 OCRD的订单。" CardCode";
 

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

由于要添加150天和180天的列,因此我试图在HANA中重新创建"客户老化报告",但是在日期计算方面遇到了困难。

请参见下面的代码:


 选择OCRD。" CardCode" AS"客户代码",OCRD。" CardName" AS"客户名称",SUM(
     案件
         当" SYSCred" <> 0时" SYSCred" * -1
         ELSE" SYSDeb"
     END)AS"余额到期",IFNULL(SUM(
     案件
         当DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))<0 THEN
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" Future Remit",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))> = 0并且
          DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))<30)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 0-30天",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))> = 30并且
          DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))<60)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 31至60天",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))> = 60并且
          DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))<90)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 61至90天",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))> = 90并且
          DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))<120)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 91至120天",IFNULL(SUM(
     案件
         当DAYS_BETWEEN(JDT1。" DueDate",(从DUMMY中选择NOW()" NOW"))> = 120 THEN
         案件
             当" BalDueCred" <> 0时" BalDueCred" * -1
             其他" BalDueDeb"
         结束
     END),0.00)AS" 120+天"
 从JDT1,
     OCRD
 在JDT1。" ShortName" = OCRD。" CardCode"和OCRD。" CardType" ='c'
 OCRD的GROUP。" CardCode",OCRD。" CardName" HAVING SUM(
 案件
     当" SYSCred" <> 0时" SYSCred" * -1
     ELSE" SYSDeb"
 END)> 0 OR SUM(
 案件
     当" SYSCred" <> 0时" SYSCred" * -1
     ELSE" SYSDeb"
 结束)<0
 OCRD的订单。" CardCode";
 
付费偷看设置
发送
4条回答
N-Moskvin
1楼 · 2020-09-27 19:58.采纳回答

当前形式的语句相当混乱,因为许多代码重复了,而且不容易看出目的是什么。

我将其重写为这种形式:

选择
       "客户代码"
     , "顾客姓名"
     , "余额到期"
     ,总和
             当" DueDays" <0则" BalanceDue"
             其他0.00
           END)作为"未来汇款"
     ,总和
             当" DueDays"> = 0并且" DueDays" <30然后" BalanceDue"
             其他0.00
           END)AS" 0-30天"
     ,总和
             当" DueDays"> = 30并且" DueDays" <60则" BalanceDue"
             其他0.00
           END)AS" 31至60天"
     ,总和
             当" DueDays"> = 60并且" DueDays" <90则" BalanceDue"
             其他0.00
           END)AS" 61到90天"
     ,总和
             当" DueDays"> = 90且" DueDays" <120然后" BalanceDue"
             其他0.00
           END)AS" 91到120天"
     ,总和
             当" DueDays"> = 120然后" BalanceDue"
             其他0.00
           END)AS" 120+天"
 从(选择
           OCRD。" CardCode" AS"客户代码"
         ,OCRD。" CardName" AS"客户名称"
         ,DAYS_BETWEEN(JDT1。" DueDate",CURRENT_DATE)作为" DueDays"
         , 案件
            当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
            ELSE JDT1。" BalDueDeb"
           以" BalanceDue"结尾
     从
                    JDT1
         内连接OCRD
                 在JDT1上。" ShortName" = OCRD。" CardCode"
                AND OCRD。" CardType" ='c'
     通过...分组
           OCRD。" CardCode"
         ,OCRD。"卡名"
     拥有
         总和
             当" SYSCred" <> 0时" SYSCred" * -1
             ELSE" SYSDeb"
         END)<> 0); 

我所做的是:

  • 明确内部联接和联接条件
  • 将"到期日"计算和"到期余额"计算移至子查询
  • 将HAVING子句中的OR分支从" <0 OR> 0"更改为" <> 0"
  • 将列CASE语句移动到外部SELECT
  • 向ELSE提供的ELSE子句始终返回一个双精度值(0.00或"应收余额")-可以摆脱IFNULL()函数

现在,该语句更易于阅读,实际上也应该运行得更快。

根据我现在的理解,结果行不足的原因可能是:

  • 不匹配的联接
  • HAVING子句过滤掉所有结果
  • 至少一个表为空

现在应该很容易地一一检查这些可能的原因。

jovirus
2楼-- · 2020-09-27 20:16

Lars,

谢谢您使用CURRENT_DATE()选项的建议。

我遇到的困难是使用ADD_DAYS函数时。 我不小心从最初发布的代码中忽略了这一点。

我得到的错误是"("第7行第44列附近的语法不正确。

请参见下面的修改后的代码:

选择OCRD。" CardCode" AS"客户代码",OCRD。" CardName" AS"客户名称",SUM(
     案件
         当" SYSCred" <> 0时" SYSCred" * -1
         ELSE" SYSDeb"
     END)AS"余额到期",IFNULL(SUM(
     案件
         当DAYS_BETWEEN(JDT1。" DueDate",ADD_DAYS('1900-01-01 00:00:00.000',CURRENT_DATE()))<0 THEN
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" Future Remit",IFNULL(SUM(
     案件
         时间(DAYS_BETWEEN(JDT1。" DueDate",ADD_DAYS('1900-01-01 00:00:00.000',CURRENT_DATE()))> = 0并且
          DAYS_BETWEEN(JDT1。" DueDate",ADD_DAYS('1900-01-01 00:00:00.000',CURRENT_DATE()))<30)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 0-30天",IFNULL(SUM(
     案件
         时间(DAYS_BETWEEN(JDT1。" DueDate",ADD_DAYS('1900-01-01 00:00:00.000',CURRENT_DATE()))> = 30 AND
          DAYS_BETWEEN(JDT1。" DueDate",ADD_DAYS('1900-01-01 00:00:00.000',CURRENT_DATE()))<60)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 31至60天",IFNULL(SUM(
     案件
         何时(DAYS_BETWEEN(JDT1。" DueDate",ADD_DAYS('1900-01-01 00:00:00.000',CURRENT_DATE()))> = 60 AND
          DAYS_BETWEEN(JDT1。" DueDate",ADD_DAYS('1900-01-01 00:00:00.000',CURRENT_DATE()))<90)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 61至90天",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",ADD_DAYS('1900-01-01 00:00:00.000',CURRENT_DATE()))> = 90 AND
          DAYS_BETWEEN(JDT1。" DueDate",ADD_DAYS('1900-01-01 00:00:00.000',CURRENT_DATE()))<120)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 91至120天",IFNULL(SUM(
     案件
         当DAYS_BETWEEN(JDT1。" DueDate",ADD_DAYS('1900-01-01 00:00:00.000',CURRENT_DATE()))> = 120 THEN
         案件
             当" BalDueCred" <> 0时" BalDueCred" * -1
             其他" BalDueDeb"
         结束
     END),0.00)AS" 120+天"
 从JDT1,
     OCRD
 在JDT1。" ShortName" = OCRD。" CardCode"和OCRD。" CardType" ='c'
 OCRD的GROUP。" CardCode",OCRD。" CardName" HAVING SUM(
 案件
     当" SYSCred" <> 0时" SYSCred" * -1
     ELSE" SYSDeb"
 END)> 0 OR SUM(
 案件
     当" SYSCred" <> 0时" SYSCred" * -1
     ELSE" SYSDeb"
 结束)<0


 
haha101010
3楼-- · 2020-09-27 20:14

好吧,这实际上是我的错误:CURRENT_DATE函数调用没有括号()。

无论如何,现在应该是WHEN条件

从" due_date"到计算出的日期之间的天数,该天数大于或等于120。
计算出的日期应在1900年1月1日前加上X天。 那没有道理!

能否请您口头描述您要实施的规则?

关于上个世纪初的参考是什么?
您不想说类似的话吗?

"如果截止日期距离今天还有120天或更长时间,则..."?

CJones
4楼-- · 2020-09-27 20:06

嗨,拉尔斯,

您提供给我的逻辑是正确的,并且比我刚开始使用时更容易,但是在进行更改之后,查询将无错误运行,但不返回任何行。

基本上,我正在尝试重新创建"客户应收帐款"账龄查询,这样我可以包括150天和180天以上。 我正在尝试通过转换可在SQL中使用的查询来实现这一目标,但对于HANA界面和HANA语言中涉及的日期函数,我仍然是陌生的。

谢谢您到目前为止为我提供的所有帮助。

请参见下面的修改后的代码:

选择OCRD。" CardCode" AS"客户代码",OCRD。" CardName" AS"客户名称",SUM(
     案件
         当" SYSCred" <> 0时" SYSCred" * -1
         ELSE" SYSDeb"
     END)AS"余额到期",IFNULL(SUM(
 案件
         当DAYS_BETWEEN(JDT1。" DueDate",CURRENT_DATE)<0 THEN
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" Future Remit",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",CURRENT_DATE)> = 0并且
          DAYS_BETWEEN(JDT1。" DueDate",CURRENT_DATE)<30)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 0-30天",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",CURRENT_DATE)> = 30并且
          DAYS_BETWEEN(JDT1。" DueDate",CURRENT_DATE)<60)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 31至60天",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",CURRENT_DATE)> = 60并且
          DAYS_BETWEEN(JDT1。" DueDate",CURRENT_DATE)<90)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 61至90天",IFNULL(SUM(
     案件
         当(DAYS_BETWEEN(JDT1。" DueDate",CURRENT_DATE)> = 90并且
          DAYS_BETWEEN(JDT1。" DueDate",CURRENT_DATE)<120)然后
         案件
             当JDT1。" BalDueCred" <> 0则JDT1。" BalDueCred" * -1
             ELSE JDT1。" BalDueDeb"
         结束
     END),0.00)AS" 91至120天",IFNULL(SUM(
     案件
         当DAYS_BETWEEN(JDT1。" DueDate",CURRENT_DATE)> = 120则
         案件
             当" BalDueCred" <> 0时" BalDueCred" * -1
             其他" BalDueDeb"
         结束
     END),0.00)AS" 120+天"
 从JDT1,
     OCRD
 在JDT1。" ShortName" = OCRD。" CardCode"和OCRD。" CardType" ='c'
 OCRD的GROUP。" CardCode",OCRD。" CardName" HAVING SUM(
 案件
     当" SYSCred" <> 0时" SYSCred" * -1
     ELSE" SYSDeb"
 END)> 0 OR SUM(
 案件
     当" SYSCred" <> 0时" SYSCred" * -1
     ELSE" SYSDeb"
 结束)<0
 

亲切的问候,

Vinolan Pillay

一周热门 更多>