【问题标题】:not a single group group by function不是按功能分组的单个组
【发布时间】:2021-01-15 19:09:51
【问题描述】:

在运行以下查询时,我没有得到单个组组功能,我应该怎么做才能运行它?:

SELECT COUNT(wtt1.wrt_ip_num),
       wtt1.wrt_from_ward_cd,
       wbm.wbm_room_num,
       wbm.wbm_bed_num,
       TRUNC(wtt1.wrt_in_dt),
       wtt1.wrt_out_dt
  FROM w_transfer_txn wtt1, w_ward_master_base wmb, w_bed_master_base wbm
 WHERE wtt1.wrt_from_ward_cd = wmb.wwm_ward_cd
   AND wmb.wwm_ward_locn = 'TMH'
   AND wbm.wbm_bed_num = wtt1.wrt_from_bed_num
   AND wbm.wbm_room_num = wtt1.wrt_from_room_num
   AND wbm.wbm_ward_cd = wtt1.wrt_from_ward_cd
   AND (wtt1.wrt_ip_num, wtt1.wrt_sl_num) IN
       (SELECT wtt.wrt_ip_num, MAX(wtt.wrt_sl_num) wrt_sl_num
          FROM w_transfer_txn wtt
         WHERE /*wtt.wrt_ip_num='IP/20/034619' AND*/
               TRUNC(wtt.wrt_in_dt) < TO_DATE('29-Sep-2020', 'DD-MON-`YYYY')
          AND (wtt.wrt_out_dt IS NULL OR (wtt.wrt_out_dt) >= TO_DATE('29-Sep-2020', 'DD-MON-YYYY'))
         GROUP BY TRUNC(wtt.wrt_in_dt), wtt1.wrt_from_ward_cd, wtt.wrt_ip_num)
 ORDER BY TRUNC(wtt1.wrt_in_dt) DESC

【问题讨论】:

    标签: sql oracle group-by oracle11g


    【解决方案1】:

    查询中有一些问题和需要重新排列,例如

    • 修复您的查询,以便在表之间使用明确的JOIN 语法 而不是逗号分隔的旧 JOIN 语法,以便轻松 操纵它。

    • 所有非聚合列应列在GROUP BY 子句旁边。

         GROUP BY wtt1.wrt_from_ward_cd, wbm.wbm_room_num, wbm.wbm_bed_num,
                  TRUNC(wtt1.wrt_in_dt), wtt1.wrt_out_dt
      

      用于外部查询。基本上你的错误是由于这个问题。子查询中只有一个非聚合列 (wtt.wrt_ip_num)。所以,使用GROUP BY wtt.wrt_ip_num 就足够了。

    • TRUNC(wtt1.wrt_in_dt) 列可能有别名,例如 trc_in_dt,并在带有该别名 (ORDER BY trc_in_dt DESC) 的 ORDER BY 子句中使用。顺便说一句,在子查询中为MAX(wtt.wrt_sl_num) 使用别名(wrt_sl_num)是多余的。

    • 一年前的第一个日期转换中有一个反引号 部分,这是一个错字,应该更正。顺便提一句, TO_DATE('29-Sep-2020', 'DD-MON-YYYY') 日期转换可能是 替换为日期文字,例如 date'2020-09-29' 以使其成为 简短。

      SELECT COUNT(wtt1.wrt_ip_num),
             wtt1.wrt_from_ward_cd,
             wbm.wbm_room_num,
             wbm.wbm_bed_num,
             TRUNC(wtt1.wrt_in_dt) AS trc_in_dt,
             wtt1.wrt_out_dt
        FROM w_transfer_txn wtt1
        JOIN w_ward_master_base wmb
          ON wtt1.wrt_from_ward_cd = wmb.wwm_ward_cd
        JOIN w_bed_master_base wbm
         AND wbm.wbm_bed_num = wtt1.wrt_from_bed_num
         AND wbm.wbm_room_num = wtt1.wrt_from_room_num
         AND wbm.wbm_ward_cd = wtt1.wrt_from_ward_cd   
       WHERE wmb.wwm_ward_locn = 'TMH'
         AND (wtt1.wrt_ip_num, wtt1.wrt_sl_num) IN
             (SELECT wtt.wrt_ip_num, MAX(wtt.wrt_sl_num)-- wrt_sl_num
                FROM w_transfer_txn wtt
               WHERE TRUNC(wtt.wrt_in_dt) < date'2020-09-29'
                 AND (wtt.wrt_out_dt IS NULL OR wtt.wrt_out_dt >= date'2020-09-29')
               GROUP BY wtt.wrt_ip_num)
       GROUP BY wtt1.wrt_from_ward_cd, wbm.wbm_room_num, wbm.wbm_bed_num, 
                TRUNC(wtt1.wrt_in_dt), wtt1.wrt_out_dt         
       ORDER BY trc_in_dt DESC
      

    【讨论】:

      【解决方案2】:

      父查询缺少“分组依据”部分

      只需在“Order by trunc(wtt1.wrt_in_dt) desc”行之前添加它

      group by
         wtt1.wrt_from_ward_cd,
         wbm.wbm_room_num,
         wbm.wbm_bed_num,
         trunc(wtt1.wrt_in_dt),
         wtt1.wrt_out_dt
      

      这应该足以摆脱“缺少组表达式”错误

      【讨论】:

      • 错误消失了,但它进入了无限循环。查询中还应该有 2 个分组依据
      • @sandeeppradhan 从远程很难说为什么执行查询需要这么长时间。我认为内部查询是可以相当优化的。试试这个 ((Select wtt.wrt_ip_num, max(wtt.wrt_sl_num) wrt_sl_num FROM W_TRANSFER_TXN wtt where /*wtt.wrt_ip_num='IP/20/034619' and*/ trunc(wtt.wrt_in_dt) = TO_DATE('29-Sep-2020', 'DD-MON-YYYY')) 组 by wtt.wrt_ip_num) )
      • 当涉及聚合(又名组)函数时,需要“分组依据”部分。所有其他列必须在 GROUP BY 子句中指定。对于每个“选择”字的组函数和附加列,必须有一个“分组依据”子句。例如 SELECT MAX(col1), col2, col3 .... GROUP BY col2, col3
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2017-01-15
      • 2013-09-19
      • 1970-01-01
      • 2016-10-27
      相关资源
      最近更新 更多