【问题标题】:SQL query to get sum of headcount according to column groupingSQL查询根据列分组获取总人数
【发布时间】:2020-06-02 15:30:53
【问题描述】:

以下查询用于查找特定部门的员工人数。这工作正常-

 SELECT distinct --LVL2_ORG,
            division, 
           district, 
           department, 
           Count(DISTINCT person_number) 
             over ( 
               PARTITION BY department) AS dep_empl_count 
    FROM   flattened_tree, 
           hr_org_unit_classifications_f houcf, 
           hr_all_organization_units_f haouf, 
           hr_organization_units_f_tl hauft, 
           per_all_assignments_m paam, 
           per_all_people_f papf 
    WHERE  haouf.organization_id = flattened_tree.department_id 
           AND haouf.organization_id = houcf.organization_id 
           AND haouf.organization_id = hauft.organization_id 
           AND haouf.effective_start_date BETWEEN 
               houcf.effective_start_date AND houcf.effective_end_date 
           AND hauft.LANGUAGE = 'US' 
           AND hauft.effective_start_date = haouf.effective_start_date 
           AND hauft.effective_end_date = haouf.effective_end_date 
           AND houcf.classification_code = 'DEPARTMENT' 
           AND Trunc(SYSDATE) BETWEEN hauft.effective_start_date AND 
                                      hauft.effective_end_date 
           AND hauft.organization_id = paam.organization_id 
           AND paam.person_id = papf.person_id 
           AND paam.primary_assignment_flag = 'Y' 
           AND paam.assignment_type = 'E' 
           AND paam.assignment_status_type IN ( 'ACTIVE', 'SUSPENDED' ) 
           AND paam.effective_latest_change = 'Y' 
           AND trunc(sysdate) between paam.effective_start_date and paam.effective_end_date
AND trunc(sysdate) between papf.effective_start_date and papf.effective_end_date

ORDER  BY division,district,department

输出看起来像 -

DIVISION            DISTRICT        DEPARTMENT              JAN
CA Division         Grande          XYZ                     0
CA Division         Deer            Deer Tubing             1
CA Division         Deer            XYZ  Fracturing         0
CA Division         Fracturing      CAA  Fracturing         3

US Division         Neuquen         Support                 101
US Division         Neuquen         Cementing               3
US Division         Corporate       Fracturing              190

现在我想在分区和地区级别计算同一查询中的总和。即同一查询中每个地区和每个部门的人数总和(JAN 列)。这可能吗?

输出应该看起来像 -

DIVISION            DISTRICT        DEPARTMENT              JAN    SUM(DIVISION)    SUM(DISTRICT)
CA Division         Grande          XYZ                     0        4               0
CA Division         Deer            Deer Tubing             1        4               1
CA Division         Deer            XYZ  Fracturing         0        4               1
CA Division         Fracturing      CAA  Fracturing         3        4               3

US Division         Neuquen         Support                 101      294            104        
US Division         Neuquen         Cementing               3        294            104
US Division         Corporate       Fracturing              190      294            190

所以从上面的输出 - 部门的总和应该是一个部门(CA部门和美国部门)中所有员工人数的总和 和区的总和应该是鹿区 - 1+0=1 内乌肯区 101+3=104 像这样。

【问题讨论】:

  • 您没有采用 ANSI-92 显式 JOIN 语法的任何原因?他们已经存在 28 年了。你现在放弃那个 31 岁的语法已经很久了。
  • 我希望你永远不需要在你的公司里做一个LEFT JOIN!我怀疑 Oracle 不再支持旧的 *= 语法,就像其他现代 RDBMS 一样。
  • @Larnu 。 . .他们似乎也厌恶GROUP BY。 . .我认为自从有标准之前就已经在 SQL 中了。
  • @GordonLinoff 和@Larnu - 感谢您的反馈!我将缓慢而稳定地更改语法。我是这个论坛和 SQL 编码的新手。如果我无意中没有使用标准格式,请原谅!
  • 很高兴听到这个消息,@SHSH_123。抱歉,我们打断了您的问题,但在 SQL 社区中,不使用显式连接(也不是显式 GROUP BY)通常被视为危险信号。它通常指向更大的设计缺陷或严重缺乏对语言的理解/知识。否则,可能是因为有人在使用非常旧版本的 RDBMS,但我们谈论的是 90 年代初发布的版本;因此,如果您使用的是这样的版本并且没有通知我们,那么任何答案都可能对您毫无用处,因为几十年前的软件将不支持它们。

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:

而不是 1 个度量:

   Count(DISTINCT person_number) 
     over ( 
       PARTITION BY department) AS dep_empl_count

使用 3 个措施:

   Count(DISTINCT person_number) over (PARTITION BY department) AS dep_empl_count, 
   Count(DISTINCT person_number) over (PARTITION BY division) AS div_empl_count, 
   Count(DISTINCT person_number) over (PARTITION BY district) AS dis_empl_count 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2020-09-06
    • 2019-01-04
    • 1970-01-01
    • 2014-09-25
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多