我遇到了问题,因为我对查询不太满意。
我有一个包含两个选择查询的联合的查询:
SELECT em.emp_code,
em.emp_name,
COALESCE(SUM(pe.hours_allotted),0) AS hours,
pe.dated
FROM employee_master em
LEFT JOIN project_employee pe ON (pe.Emp_code = em.emp_code)
WHERE (dated >= '2011-03-14'
AND dated < '2011-03-20' )
OR dated IS NULL
GROUP BY em.emp_code
UNION
(SELECT em.emp_code,
em.emp_name,
'0' AS hours,
pe.dated
FROM employee_master em
LEFT JOIN project_employee pe ON (pe.Emp_code = em.emp_code)
WHERE (dated >= '2011-03-14'
AND dated < '2011-03-20' )
OR dated IS NOT NULL
GROUP BY em.Emp_code)
ORDER BY emp_name;
现在结果集返回例如:
ecode ename hours
----------------------
201 Alak basu 10
201 alak basu 0
第一个结果来自union的第一个select语句,其中hours = 10 and hours = 0来自第二个联合声明。
我想要的是:
ecode ename hours
----------------------------
201 alak basu 10
在这种情况下,每个ecode应该只有一个结果。如何将它组合起来就像用ecode总结小组一样,这样它只给我一个上面的结果?
答案 0 :(得分:2)
如果所需的结果是将单个员工代码的所有小时数合并为一行,而UNION
之后的第二个查询只返回零小时,那么这里的最佳解决方案似乎就是获得摆脱UNION
。
编辑:进一步说明之后,我认为SQL应该是这样的:
SELECT em.emp_code,
em.emp_name,
COALESCE(pe.hours, 0) AS hours
FROM employee_master em
LEFT JOIN (
SELECT emp_code,
SUM(hours_allotted) AS hours
FROM project_employee
WHERE dated >= '2011-03-14' AND
dated < '2011-03-20'
GROUP BY emp_code
) pe ON (pe.emp_code = em.emp_code)
ORDER BY em.emp_name;
它正在做什么:
project_employee
条目过滤到指定日期范围内的条目。 (请注意,这里根本不需要进行NULL
或NOT NULL
检查。日期在范围内,或者不是。)employee_master
表中的所有员工,并在筛选的求和project_employee
子查询结果集中搜索匹配的条目。 (因为它是LEFT JOIN
,即使没有过滤的project_employee
条目匹配,主表中的每个员工都会有一个条目。)pe.hours
列将为NULL
,导致COALESCE
恢复为第二个零值。emp_name
订购结果。答案 1 :(得分:2)
您可以随时执行以下操作:
select emp_code, min(emp_name) as emp_name, sum(hours)
from (
<your original query here>
) as e
group by emp_code
order by emp_name;