gpt4 book ai didi

按多列分组时,MySQL 查询隐藏结果

转载 作者:行者123 更新时间:2023-11-30 22:52:55 25 4
gpt4 key购买 nike

我正在尝试获取按县分割的员工从 1 月到 11 月的总工作时数。我只对过去 60 天内在任何地方工作过的员工感兴趣。

当我运行这个查询时:

SELECT DISTINCT(a.empid) AS EMPL_ID, a.cnty AS COUNTY, SUM(a.hours) AS HRS 
FROM timesheet_lines AS a
WHERE a.date >= '2014-1-1'
AND a.date <= '2014-11-30'
GROUP BY EMPL_ID
HAVING MAX(a.date) > '2014-10-18';

我得到了正确的小时数,但没有按县分割。

当我像这个查询一样按县添加分组时:

SELECT DISTINCT(a.empid) AS EMPL_ID, a.cnty AS COUNTY, SUM(a.hours) AS HRS 
FROM timesheet_lines AS a
WHERE a.date >= '2014-1-1'
AND a.date <= '2014-11-30'
GROUP BY EMPL_ID, COUNTY
HAVING MAX(a.date) > '2014-10-18';

它按县分割,但它删除了县以及过去 60 天内未在该特定县工作的员工在这些县的工作时间。

我怎样才能按县添加细目分类,并仍然获得所有工作时间?

这是我想为一名员工提取的数据示例:

EMPL_ID COUNTY  HRS
------- ------ ---
5461 ONTARIO 105
5461 WAYNE 1182
5461 YATES 24

这是我仅按 EMPL_ID 分组时得到的结果:

EMPL_ID COUNTY  HRS
------- ------ ---
5461 ONTARIO 1311

它具有正确的总小时数,但未按 COUNTY 正确分割。

这是我按 EMPL_ID COUNTY 分组时得到的结果:

EMPL_ID COUNTY  HRS
------- ------ ---
5461 ONTARIO 105
5461 WAYNE 1182

现在它按县分割,但我认为它忽略了 YATES 县,因为该员工在过去 60 天内没有在 YATES 县工作。

最佳答案

首先,当您使用group by 时,您不需要distinct

其次,问题在于您的 having 子句。您需要过滤员工,但报告员工/县组合。这需要某种子查询。这是一种方法:

SELECT a.empid AS EMPL_ID, a.cnty AS COUNTY, SUM(a.hours) AS HRS 
FROM timesheet_lines AS a
WHERE a.date >= '2014-01-01' AND a.date <= '2014-11-30' AND
a.empid IN (SELECT EmpId
FROM timesheet_lines tl
GROUP BY EmpId
HAVING MAX(date) > '2014-10-18'
)
GROUP BY EMPL_ID, COUNTY;

编辑;

in 花费的时间太长时,将其替换为 join:

SELECT a.empid AS EMPL_ID, a.cnty AS COUNTY, SUM(a.hours) AS HRS 
FROM timesheet_lines a JOIN
(SELECT EmpId
FROM timesheet_lines tl
GROUP BY EmpId
HAVING MAX(date) > '2014-10-18'
) e
on a.EmpId = e.EmpId
WHERE a.date >= '2014-01-01' AND a.date <= '2014-11-30'
GROUP BY EMPL_ID, COUNTY;

其实我一开始就应该这样写,但是我没有意识到你的数据有多大(而且我认为 IN 版本更容易阅读)。

关于按多列分组时,MySQL 查询隐藏结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27568777/

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