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

原文地址:https://www.cnblogs.com/jyj666/p/13986808.html