如何从同一表的manager_id中提取下属的数量?

时间:2019-06-20 11:58:26

标签: sql oracle

我有两列:一列与employee_id和一列与manager_id 除了employee_id为100的总裁没有经理(因此manager_id为null)之外,其余的还有经理。例如,总统是manager_id为100的两个人的经理。如何以这种方式计数和放置它: employee_id 100(column1)有2个下属(column2)?

尝试计数,求和,大小写,子查询并且不起作用

select employee_id,
       manager_id,
       first_name,
       last_name,
       case when employee_id = manager_id then count(employee_id) end,
       count(manager_id)
from   employees
--where manager_id is not null
group by manager_id,
       employee_id,
       first_name,
       last_name
--having sum(manager_id) > 5
order by employee_id;

我希望第一列为employee_id,第二列为每个employee_id计算的下属。

4 个答案:

答案 0 :(得分:3)

使用相关的分层查询:

Oracle设置

RecyclerView

查询

ArrayList<ModelClass> objModelClassArrayList;

public DatabaseRecyclerAdapter(ArrayList<ModelClass> objModelClassArrayList) {
    this.objModelClassArrayList = objModelClassArrayList;
}

@NonNull
@Override
public DatabaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
{
    View singleRow= LayoutInflater.from(parent.getContext()).inflate(R.layout.single_row,parent,false);
    return new DatabaseViewHolder(singleRow);

}

@Override
public void onBindViewHolder(@NonNull DatabaseViewHolder holder, int position)
{
    ModelClass objModelClass=objModelClassArrayList.get(position);
    holder.userNameTV.setText(objModelClass.getName());
    holder.userLocation.setText(objModelClass.getAddress());
    String e1=objModelClass.getEmail();
    holder.userEmail.setText(e1);


}


@Override
public int getItemCount() {
    return objModelClassArrayList.size();
}

public static class DatabaseViewHolder extends RecyclerView.ViewHolder
{

    TextView userNameTV,userLocation,userEmail;
    public DatabaseViewHolder(@NonNull View itemView)
    {
        super(itemView);
        userNameTV=itemView.findViewById(R.id.sr_userNameTV);
        userLocation=itemView.findViewById(R.id.sr_location);
        userEmail=itemView.findViewById(R.id.sr_email);
    }
}

输出

EMPLOYEE_ID | NUM_SUBORDINATES
----------: | ---------------:
        100 |                9
        101 |                8
        102 |                2
        103 |                1
        104 |                0
        105 |                2
        106 |                1
        107 |                0
        108 |                1
        109 |                0

db <>提琴here

答案 1 :(得分:0)

如果我了解您的问题,您也可以使用简单的分组依据来解决 这将仅计入下属而不是整个层次

with tab as(
  select 1 as emp_id, null as man_id from dual union all
  select 2 as emp_id, 1 as man_id from dual union all
  select 3 as emp_id, 1 as man_id from dual union all    
  select 2 as emp_id, null as man_id from dual union all
  select 5 as emp_id, 2 as man_id from dual 
)

select man_id as employee_id
      , count(1) as cnt
from tab
where man_id is not null
group by man_id
EMPLOYEE_ID | CNT
----------: | --:
          2 |   1
          1 |   2

db <>提琴here

答案 2 :(得分:0)

尝试一下:

-- data preparation
WITH EMPS AS 
(
SELECT 1001 AS EMP_ID, 'emp11' AS POS, 100 AS MGR_ID FROM DUAL UNION ALL
SELECT 1002 AS EMP_ID, 'emp12' AS POS, 100 AS MGR_ID  FROM DUAL UNION ALL
SELECT 1003 AS EMP_ID, 'emp13' AS POS, 100 AS MGR_ID  FROM DUAL UNION ALL
SELECT 2001 AS EMP_ID, 'emp21' AS POS, 200 AS MGR_ID  FROM DUAL UNION ALL
SELECT 2002 AS EMP_ID, 'emp22' AS POS, 200 AS MGR_ID  FROM DUAL UNION ALL
SELECT 100 AS EMP_ID, 'mgr1' AS POS, 1 AS MGR_ID  FROM DUAL UNION ALL
SELECT 200 AS EMP_ID, 'mgr2' AS POS, 1 AS MGR_ID  FROM DUAL UNION ALL
SELECT 1 AS EMP_ID, 'President' AS POS, NULL AS MGR_ID FROM DUAL )
-- Your actual query starts from here
SELECT
    EE.EMP_ID,
    EE.POS,
    EE.MGR_ID,
    CASE
        WHEN EC.CNT IS NULL THEN 0
        ELSE EC.CNT
    END AS CNT
FROM
    EMPS EE
    LEFT JOIN (
        SELECT
            MGR_ID,
            COUNT(1) AS CNT
        FROM
            EMPS
        GROUP BY
            MGR_ID
    ) EC ON EE.EMP_ID = EC.MGR_ID
ORDER BY
    EE.EMP_ID;

请根据您的需要添加其他条件。

DB Fiddle demo

答案 3 :(得分:0)

尝试一下,在选择中使用选择

select emp.employee_id,
           emp.manager_id,
           emp.first_name,
           emp.last_name,
          (SELECT SUM(employees.employee_id) FROM employees where employees.manager_id=emp.employee_id) as subordinates,
           count(manager_id)
    from   employees emp