zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Struts2再曝高危漏洞(S2-020补丁绕过)
    JavaWeb学习总结(十三)——使用Session防止表单重复提交
    JavaWeb学习总结(十二)——Session
    javaweb学习总结(十一)——使用Cookie进行会话管理
    如何做个好员工(转载)
    剖析云计算中的“共享型数据库”(转载)
    云计算的基本概念(转载)
    javaweb学习总结(十)——HttpServletRequest对象(一)
    javaweb学习总结(九)—— 通过Servlet生成验证码图片
    javaweb学习总结(八)——HttpServletResponse对象(二)
  • 原文地址:https://www.cnblogs.com/jyj666/p/13986808.html
Copyright © 2011-2022 走看看