gpt4 book ai didi

sql - 使用不同条件从同一个表进行一个 SQL 查询中的多个聚合函数

转载 作者:行者123 更新时间:2023-12-02 08:17:44 26 4
gpt4 key购买 nike

我正在创建一个 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(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
) EmployeeAbsences
Where ABSENT_TOTAL > 10 or ABSENT_YEAR > 3

这样,如果您更改案例条件,则仅在一个位置进行更改。

关于sql - 使用不同条件从同一个表进行一个 SQL 查询中的多个聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2654750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com