HANA客户账龄报告

2020-09-27 19:54发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)嗨, 由于要添加150天和18...

         点击此处--->   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
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子句过滤掉所有结果
  • 至少一个表为空

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

一周热门 更多>