从GROUP BY子句中排除子查询

2020-09-10 17:03发布

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

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


我有两个作为子查询实现的属性字段。

住院治疗\住院时间\开始日期

(从double中选择smart_date(@Prompt(起始日期))

住院治疗\ Hosp Admsn时间\ 结束日期

(从double选择smart_date(@Prompt(结束日期)))

每个子查询调用一个Oracle函数( smart_date ),该函数将提示提供的符号值转换为日期/时间值。 例如," T-1"是"昨天",它是2019年4月3日(截至此发布之日)。

Homs Admsn Range in Range 过滤器中使用了两个属性字段:

 @Select(医院住院\ Admsn时间\开始日期)和@Select(医院住院\ Admsn时间\结束日期)之间的@Select(医院住院时间)

子查询用于SELECT(允许在报表中显示实际日期)和WHERE(用于过滤日期/时间字段)中。

查询示例:

生成的SQL:

选择
   部门组织
   ,Count(Distinct(ENC.ID))
   ,(从double选择SELECT smart_date(@Prompt(Starting Date)))
   ,(SELECT smart_date(@Prompt(Ending Date))+ 0.99999 FROM dual)
 来自ENC
 右外连接DEP ON(DEP.DEPT_ID = ENC.DEPT_ID)
 哪里
   (
    (((ENC.ADMSN_TIME)之间((SELECT smart_date(@Prompt(Starting Date))FROM dual)))和((SELECT smart_date(@Prompt(Ending Date))+ 0.99999 FROM dual)))
   )
 通过...分组
   部门组织
   ,(从double选择SELECT smart_date(@Prompt(Starting Date)))
   ,(SELECT smart_date(@Prompt(Ending Date))+ 0.99999 FROM dual)

不幸的是,运行查询会导致Oracle错误:

ORA-22818:此处不允许使用子查询表达式

如果我从GROUP BY子句中删除子查询,查询将按预期工作:

选择
   部门组织
   ,Count(Distinct(ENC.ID))
   ,(从double选择SELECT smart_date(@Prompt(Starting Date)))
   ,(SELECT smart_date(@Prompt(Ending Date))+ 0.99999 FROM dual)
 来自ENC
 右外连接DEP ON(DEP.DEPT_ID = ENC.DEPT_ID)
 哪里
   (
    (((ENC.ADMSN_TIME)之间((SELECT smart_date(@Prompt(Starting Date))FROM dual)))和((SELECT smart_date(@Prompt(Ending Date))+ 0.99999 FROM dual)))
   )
 通过...分组
   部门组织

是否可以配置属性,以便将它们包含在SELECT子句中,但不包括在GROUP BY子句中?

(48.8 kB)

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

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


我有两个作为子查询实现的属性字段。

住院治疗\住院时间\开始日期

(从double中选择smart_date(@Prompt(起始日期))

住院治疗\ Hosp Admsn时间\ 结束日期

(从double选择smart_date(@Prompt(结束日期)))

每个子查询调用一个Oracle函数( smart_date ),该函数将提示提供的符号值转换为日期/时间值。 例如," T-1"是"昨天",它是2019年4月3日(截至此发布之日)。

Homs Admsn Range in Range 过滤器中使用了两个属性字段:

 @Select(医院住院\ Admsn时间\开始日期)和@Select(医院住院\ Admsn时间\结束日期)之间的@Select(医院住院时间)

子查询用于SELECT(允许在报表中显示实际日期)和WHERE(用于过滤日期/时间字段)中。

查询示例:

生成的SQL:

选择
   部门组织
   ,Count(Distinct(ENC.ID))
   ,(从double选择SELECT smart_date(@Prompt(Starting Date)))
   ,(SELECT smart_date(@Prompt(Ending Date))+ 0.99999 FROM dual)
 来自ENC
 右外连接DEP ON(DEP.DEPT_ID = ENC.DEPT_ID)
 哪里
   (
    (((ENC.ADMSN_TIME)之间((SELECT smart_date(@Prompt(Starting Date))FROM dual)))和((SELECT smart_date(@Prompt(Ending Date))+ 0.99999 FROM dual)))
   )
 通过...分组
   部门组织
   ,(从double选择SELECT smart_date(@Prompt(Starting Date)))
   ,(SELECT smart_date(@Prompt(Ending Date))+ 0.99999 FROM dual)

不幸的是,运行查询会导致Oracle错误:

ORA-22818:此处不允许使用子查询表达式

如果我从GROUP BY子句中删除子查询,查询将按预期工作:

选择
   部门组织
   ,Count(Distinct(ENC.ID))
   ,(从double选择SELECT smart_date(@Prompt(Starting Date)))
   ,(SELECT smart_date(@Prompt(Ending Date))+ 0.99999 FROM dual)
 来自ENC
 右外连接DEP ON(DEP.DEPT_ID = ENC.DEPT_ID)
 哪里
   (
    (((ENC.ADMSN_TIME)之间((SELECT smart_date(@Prompt(Starting Date))FROM dual)))和((SELECT smart_date(@Prompt(Ending Date))+ 0.99999 FROM dual)))
   )
 通过...分组
   部门组织

是否可以配置属性,以便将它们包含在SELECT子句中,但不包括在GROUP BY子句中?

(48.8 kB)
付费偷看设置
发送
1条回答
SKY徐
1楼-- · 2020-09-10 17:26

尝试以下操作:创建一个包含提示逻辑的派生表,例如:

选择smart_date(@Prompt(Starting Date))作为开始日期,smart_date(@Prompt(Ending Date))作为Ending_date FROM  DUAL 

称之为" DT"。 现在将其加入到您的ENC表中,并嵌入BETWEEN逻辑:

 ENC.ADMSN_TIME DT.STARTING_DATE和DT.ENDING_DATE 

这应该为您提供如下SQL:

选择
   部门组织
   Count(Distinct(ENC.ID)),
   DT.STARTING_DATE,
   DT_ENDING_DATE
 来自ENC
   右外连接DEP ON(DEP.DEPT_ID = ENC.DEPT_ID)
   内联接(选择smart_date(@Prompt(开始日期))作为开始日期,smart_date(@Prompt(结束日期))作为结束日期FROM DUAL)DT
       在DT.STARTING_DATE和DT.ENDING_DATE之间的ENC.ADMSN_TIME
 通过...分组
   部门组织
   DT.STARTING_DATE,
   DT_ENDING_DATE
 

(我假设您的提示参数不仅包含"开始日期"和"结束日期",但我保留了它们的原样)

一周热门 更多>