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
分类:
数据库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署