Sql 多个表上联接后的计数和多个列值的计数

Sql 多个表上联接后的计数和多个列值的计数,sql,oracle12c,Sql,Oracle12c,请帮我解决以下问题 表1员工详细信息 emp name empno. --------------------------------- John 1234 Joe 6789 表2员工分配 empno assignmentstartdate assignmentenddate assignmentID empassignmentID ----------------------------------------

请帮我解决以下问题

表1员工详细信息

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