• Oracle Groupby分组缺少表达式解决方法


    最近写Oracle的时候发现一个很蛋疼的问题。。。就是Oracle中的分组函数很奇妙,废话不多说直接上例子。

    SELECT '患者平均住院时间' TITLE,
                            NVL((NVL(A.OUTPHOSPITAL_TIME,null)- NVL(A.INPHOSPITAL_TIME,null)),null)AVGTIME,
                            TO_CHAR(T.Register_Time,'YYYY-MM') AS MONTHS
                            FROM MED_WOUND_PATIENT_TRANSFERINFO A
                                 LEFT JOIN MED_WOUND_PATIENT_REGISTER T ON A.REGISTER_ID =T.REGISTER_ID 
                            GROUP BY TO_CHAR(T.Register_Time,'YYYY-MM'),NVL((NVL(A.OUTPHOSPITAL_TIME,null)- NVL(A.INPHOSPITAL_TIME,null)),null)
                            ORDER BY TO_CHAR(T.Register_Time,'YYYY-MM')

    这是一个根据T.Register_Time分组查询的一个代码(表A和表T是一对一的关系)但是这样查下来结果是这样的:

     很明显分组失败了,然后网上查了一波老哥们说Oracle的Groupby分组只能对单字段分组,,,

    例子:

    例如,下面这个sql在mysql中可以执行,但在oracle中不能执行
    select
    a.id,a.name
    from
    a_table a
    group by a.id

    oracle需修改成:
    select
    a.id,a.name
    from
    a_table a
    group by a.id,a.name order by a.id

    于是乎有老哥提出了解决方法:

    SELECT * FROM
    (
    SELECT ROW_NUMBER() OVER(PARTITION BY a.id ORDER BY a.id ) RN ,
    FROM a_table a
    )
    where rn = 1

    于是我按照这样进行改写:

     SELECT * FROM
                            (
                            SELECT '患者平均住院时间' TITLE,TO_CHAR(T.Register_Time,'YYYY-MM') MONTHS,
                            ROW_NUMBER() OVER(PARTITION BY TO_CHAR(T.Register_Time,'YYYY-MM') ORDER BY TO_CHAR(T.Register_Time,'YYYY-MM') ) RN 
                            FROM MED_WOUND_PATIENT_TRANSFERINFO A LEFT JOIN MED_WOUND_PATIENT_REGISTER T ON A.REGISTER_ID =T.REGISTER_ID 
                            )
                            where rn = 1

    效果如图:

    可是1!!!!!!!!!!!!!我还是不太满意...于是乎我就请来我同事他写下来这一段sql,我看行.

    select t.months,sum(t.avgtime),count(1),avg(t.avgtime) from (
                            SELECT '患者平均住院时间' TITLE,
                            NVL((NVL(A.OUTPHOSPITAL_TIME,null)- NVL(A.INPHOSPITAL_TIME,null)),0)AVGTIME,
                            TO_CHAR(T.Register_Time,'YYYY-MM') AS MONTHS
                            FROM MED_WOUND_PATIENT_TRANSFERINFO A
                                 LEFT JOIN MED_WOUND_PATIENT_REGISTER T ON A.REGISTER_ID =T.REGISTER_ID 
                            ) t group by t.months

     这里发现一个问题,如果你使用了GroupBy分组后面的语句里出现像我这样的运算(如果groupby后面不加这种运算你会报缺少groupby表达式)比如

    NVL((NVL(A.OUTPHOSPITAL_TIME,null)- NVL(A.INPHOSPITAL_TIME,null)),0)AVGTIME

    这时候你使用groupby会像我第一种结果一样分组会失败

     但是!!!如果你的字段里是sum啊avg函数啊什么的就不会失败...我蛮迷的有了解的小伙伴可以回答一下我.

    好,今天就到这里啦,打桌球去喽~ o(* ̄▽ ̄*)o

  • 相关阅读:
    设计模式之工厂模式
    在线预览插件pdf.js使用记录
    自学Python:自定义模块导入问题
    MVC流程
    关于django的一些基础知识
    day72 关于rbac组件的小部分面试题
    linux的简单操作和安装
    day71 菜单的排序 点击被选中
    day063 form 和modelform组件
    day051 django第二天 django初识代码
  • 原文地址:https://www.cnblogs.com/jyj666/p/13986808.html
Copyright © 2020-2023  润新知