Sql 多个表上联接后的计数和多个列值的计数
请帮我解决以下问题 表1员工详细信息Sql 多个表上联接后的计数和多个列值的计数,sql,oracle12c,Sql,Oracle12c,请帮我解决以下问题 表1员工详细信息 emp name empno. --------------------------------- John 1234 Joe 6789 表2员工分配 empno assignmentstartdate assignmentenddate assignmentID empassignmentID ----------------------------------------
emp name empno.
---------------------------------
John 1234
Joe 6789
表2员工分配
empno assignmentstartdate assignmentenddate assignmentID empassignmentID
-----------------------------------------------------------------------------
1234 01JAN2017 02JAN2017 A1 X1
6789 01jan2017 02JAN2017 B1 Z1
表3员工分配财产
empassignmentID assignmentID propertyname propertyvalue
-------------------------------------------------------------------
X1 A1 COMPLETED true
X1 A1 STARTED true
Z1 B1 STARTED true
Z1 B1 COMPLETED false
所需结果:每位员工的已完成和已开始计数
emp name emp no. COMPLETED STARTED
------------------------------------------
John 1234 1 1
Joe 6789 0 1
目前,在我的查询中,如果我为一名员工运行,则无法正确地为propertyvalue设置计数,但无法为多名员工运行。
请帮忙
SELECT empno ,
empname ,
(SELECT COUNT(A.propertyvalue)
FROM employeedetails C ,
employees_ASSIGNMENT RCA,
employee_assignment_property A
WHERE TRUNC(startdate) >= '14jun2017'
AND TRUNC(endate) <= '20jun2017'
AND RCA.empno = C.empno
AND RCA.empassignmetid = A.empassignmetid
AND rca.EMPNO IN ('1234','6789')
AND RCA.assignmentid = A.assignmentid
AND A.Name = 'COMPLETED'
AND A.propertyvalue = 'true') ,
(SELECT COUNT(A.propertyvalue)
FROM employeedetails C ,
employees_ASSIGNMENT RCA,
employee_assignment_property A
WHERE TRUNC(startdate) >= '14jun2017'
AND TRUNC(endate) <= '20jun2017'
AND RCA.empno = C.empno
AND RCA.empassignmetid = A.empassignmetid
AND rca.EMPNO IN ('1234','6789')
AND RCA.assignmentid = A.assignmentid
AND A.Name = 'STARTED'
AND A.propertyvalue = 'true')FROM employeedetails WHERE EMPNO IN
('1234','6789') GROUP BY C.empno ,
C.EMPNAME
如果不想执行由子查询组成的脏查询,可以尝试在数据库允许的情况下创建视图 这意味着什么:我在你面前毫无用处。总之,视图是一个临时表
希望这对您有所帮助使用CTE时应该可以:
我将表名记为tbl[1 | 2 | 3]如果您希望将结果作为一个没有CTE的查询,这应该可以:
select empName,
empNo,
(select employee_details.empNo, count(employee_assignment.assId)
from employee_details as t1
join employee_assignment on (t1.empno = employee_assignment.empno)
join employee_assignment_property on (employee_assignment.assId = employee_assignment_property.assId)
where employee_assignment.ptop = 'COMPLETED'
and t.empNo = t1.empNo
group by t1.empNo ) as [COMPLETED],
(select employee_details.empNo, count(employee_assignment.assId)
from employee_details as t1
join employee_assignment on (t1.empno = employee_assignment.empno)
join employee_assignment_property on (employee_assignment.assId = employee_assignment_property.assId)
where employee_assignment.ptop = 'STARTED'
and t.empNo = t1.empNo
group by t1.empNo ) as [STARTED],
from employee_details as t
我想你只是在寻找这个:
SELECT DET.empname
, COUNT(CASE WHEN PROP.propertyname = 'COMPLETED' THEN 1 END) COMP_COUNT
, COUNT(CASE WHEN PROP.propertyname = 'STARTED' THEN 1 END) START_COUNT
FROM employeedetails DET
INNER JOIN employees_ASSIGNMENT ASS
ON ASS.empno = DET.empno
INNER JOIN employee_assignment_property PROP
ON PROP.empassignmentID = ASS.empassignmentID
AND PROP.assignmentID = ASS.assignmentID
GROUP BY DET.empname
如果需要,只需添加WHERE子句。您当前的查询是什么?另外,您使用的是什么产品;MySQL还是SQL Server?我当前的查询是:您当前的查询是什么?您不应该在注释中发布代码,欢迎使用SO。稍微绕道一点……您应该开始使用ANSI-92样式的联接。它们更容易维护,也不容易出错。它们已经存在了25年多了。我无法创建视图。最终的目标是将其放在一个GUI后面,该GUI使用纯sql以用户可读的格式显示结果。e、 g.贾斯珀/我明白了;然后,您可以使用脏子查询:子查询在这里很可能既不脏也不必要。我会使用COUNT而不是SUM,或者为SUM添加ELSE 0以获得零计数,而不是null。@ThorstenKettner,说得好。起初我使用了COUNT,然后我认为SUM可能会让它更直观一些,也许是错误的。在编辑中忘记了空值。现在编辑。谢谢你,这对我来说很有用,只是做了一些小的调整。感谢您的时间和帮助。
SELECT DET.empname
, COUNT(CASE WHEN PROP.propertyname = 'COMPLETED' THEN 1 END) COMP_COUNT
, COUNT(CASE WHEN PROP.propertyname = 'STARTED' THEN 1 END) START_COUNT
FROM employeedetails DET
INNER JOIN employees_ASSIGNMENT ASS
ON ASS.empno = DET.empno
INNER JOIN employee_assignment_property PROP
ON PROP.empassignmentID = ASS.empassignmentID
AND PROP.assignmentID = ASS.assignmentID
GROUP BY DET.empname