最近写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