在同一个表中使用不同条件的一个SQL查询中的多个聚合函数
发布时间:2020-12-12 08:30:01 所属栏目:MsSql教程 来源:网络整理
导读:我正在创建一个SQL查询,它将根据两个聚合函数的值从表中提取记录.这些聚合函数是从同一个表中提取数据,但是具有不同的过滤条件.我遇到的问题是SUM的结果比仅包含一个SUM功能大得多.我知道我可以使用临时表创建这个查询,但我只是想知道是否有一个优雅的解决方
我正在创建一个SQL查询,它将根据两个聚合函数的值从表中提取记录.这些聚合函数是从同一个表中提取数据,但是具有不同的过滤条件.我遇到的问题是SUM的结果比仅包含一个SUM功能大得多.我知道我可以使用临时表创建这个查询,但我只是想知道是否有一个优雅的解决方案,只需要一个查询.
我创建了一个简化版本来演示这个问题.以下是表结构: EMPLOYEE TABLE EMPID 1 2 3 ABSENCE TABLE EMPID DATE HOURS_ABSENT 1 6/1/2009 3 1 9/1/2009 1 2 3/1/2010 2 这里是查询: SELECT E.EMPID,SUM(ATOTAL.HOURS_ABSENT) AS ABSENT_TOTAL,SUM(AYEAR.HOURS_ABSENT) AS ABSENT_YEAR FROM EMPLOYEE E INNER JOIN ABSENCE ATOTAL ON ATOTAL.EMPID = E.EMPID INNER JOIN ABSENCE AYEAR ON AYEAR.EMPID = E.EMPID WHERE AYEAR.DATE > '1/1/2010' GROUP BY E.EMPID HAVING SUM(ATOTAL.HOURS_ABSENT) > 10 OR SUM(AYEAR.HOURS_ABSENT) > 3 任何见解将不胜感激. 解决方法SELECT E.EMPID,SUM(ABSENCE.HOURS_ABSENT) AS ABSENT_TOTAL,SUM(case when year(Date) = 2010 then ABSENCE.HOURS_ABSENT else 0 end) AS ABSENT_YEAR FROM EMPLOYEE E INNER JOIN ABSENCE ON ABSENCE.EMPID = E.EMPID GROUP BY E.EMPID HAVING SUM(ATOTAL.HOURS_ABSENT) > 10 OR SUM(case when year(Date) = 2010 then ABSENCE.HOURS_ABSENT else 0 end) > 3 编辑: 这不是什么大不了的,但我讨厌重复的条件,所以我们可以重构: Select * From ( SELECT E.EMPID,SUM(case when year(Date) = 2010 then ABSENCE.HOURS_ABSENT else 0 end) AS ABSENT_YEAR FROM EMPLOYEE E INNER JOIN ABSENCE ON ABSENCE.EMPID = E.EMPID GROUP BY E.EMPID ) EmployeeAbsences Where ABSENT_TOTAL > 10 or ABSENT_YEAR > 3 这样,如果你改变你的情况,它只在一个地方. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- SQL Server纵表与横表相互转换的方法
- SQLServer之创建表值函数
- Server2008 中 XQuery 小牛试刀
- SQLSERVER2005 中树形数据的递归查询
- 综合分析 SQL SERVER 性能优化
- sql-server – 如何找到我的(localdb)SQL Server 2012数据库
- SQLServer 2005 海量数据解决方案 分区表
- 安装sqlserver 2005数据库提醒[88,25] 属性值无效 : progid
- DBCC大全集之(适用版本MS SQLServer 2008 R2)---DBCC CHE
- sql-server – 如何检查SQL Server中索引视图的大小?