简体   繁体   English

SQL - 按计数分组 - 使用两列

[英]SQL - Group by count - using two columns

Currently I am trying to have a query which will run a headcount of nurses who are rostered to work grouped into their Cost Centre (basically their location, which ward etc.) and which segment of time they fall into(Early Shift, Late etc.)目前,我正在尝试进行一个查询,该查询将计算被安排到成本中心工作的护士人数(基本上是他们的位置、哪个病房等)以及他们属于哪个时间段(早班、晚班等)。 )

However sometimes someone from another cost centre can be transferred to a different one and I need to count this into the group as well.然而,有时来自另一个成本中心的人可能会被调到另一个成本中心,我也需要将其计入该组。

All employees have a home cost centre: HOMELABORLEVLENAME3 and then a column exists called ORGPATHTXT.所有员工都有一个家庭成本中心:HOMELABORLEVLENAME3,然后存在一个名为 ORGPATHTXT 的列。

ORGPATHTXT is always null unless they are transferred in. ORGPATHTTXT 永远是 null 除非他们被调入。

I need to group together both then segment that as per the shift times.我需要将两者组合在一起,然后根据轮班时间对其进行细分。

My current code is below:我当前的代码如下:

select 
HOMELABORLEVELNAME2, HOMELABORLEVELNAME3,

sum(CASE WHEN SHIFTSTARTDATE between '2022-05-13 04:00' and '2022-05-13 11:00' THEN 1 ELSE 0 END) as 'Today_Early',
sum(CASE WHEN SHIFTSTARTDATE between '2022-05-13 11:00' and '2022-05-13 18:00' THEN 1 ELSE 0 END) as 'Today_Late',
sum(CASE WHEN SHIFTSTARTDATE between '2022-05-13 18:00' and '2022-05-14 04:00' THEN 1 ELSE 0 END) as 'Today_Night',

sum(CASE WHEN SHIFTSTARTDATE between '2022-05-14 04:00' and '2022-05-14 11:00' THEN 1 ELSE 0 END) as 'Tmrw_Early',
sum(CASE WHEN SHIFTSTARTDATE between '2022-05-14 11:00' and '2022-05-14 18:00' THEN 1 ELSE 0 END) as 'Tmrw_Late',
sum(CASE WHEN SHIFTSTARTDATE between '2022-05-14 18:00' and '2022-05-15 04:00' THEN 1 ELSE 0 END) as 'Tmrw_Night'

from VP_SCHEDULE s

where

PERSONNUM != 'UNASSIGNEDSHIFT'
and
HOMELABORLEVELNAME2 = '40'
AND (HOMELABORLEVELNAME3 = '1914' OR HOMELABORLEVELNAME3 = '1964' OR HOMELABORLEVELNAME3 = '1924' OR HOMELABORLEVELNAME3 = '1954'
OR HOMELABORLEVELNAME3 = '1944' OR HOMELABORLEVELNAME3 = '1934' OR HOMELABORLEVELNAME3 = '1554' OR HOMELABORLEVELNAME3 = '1564'
OR HOMELABORLEVELNAME3 = '1504' OR HOMELABORLEVELNAME3 = '5334' OR HOMELABORLEVELNAME3 = '2204' OR HOMELABORLEVELNAME3 = '3104'
OR HOMELABORLEVELNAME3 = '3004' OR HOMELABORLEVELNAME3 = '2004' OR HOMELABORLEVELNAME3 = '3304' OR HOMELABORLEVELNAME3 = '2104'
OR HOMELABORLEVELNAME3 = '7554' OR HOMELABORLEVELNAME3 = '1754')
and paycodename is null
-- AND SHIFTSTARTDATE between '2022-04-29 04:00' and '2022-04-29 11:00'
group by HOMELABORLEVELNAME2, HOMELABORLEVELNAME3

This then shows as:这然后显示为:结果

My issue, is that by grouping by HOMELABORLEVELNAME3, it doesn't count the people with ORGPATHTXT filled in, but if I group by ORGPATHTXT I am not grouping by cost centre number which is a requirement.我的问题是,通过按 HOMELABORLEVELNAME3 分组,它不计算填写了 ORGPATHTXT 的人数,但如果我按 ORGPATHTXT 分组,我就不会按要求的成本中心编号进行分组。 Sorry if this is long winded.对不起,如果这是冗长的。 But any help would be appreciated.但任何帮助将不胜感激。

You need some way when ORGPATHTXT is set, to know which HOMELAGORLEVELNAME3 value it should be counted with.当设置了 ORGPATHTTXT 时,您需要一些方法来了解应该计算哪个 HOMELAGORLEVELNAME3 值。

select [...]
from vp_schedule s
left join ([... some things that maps ORGPATHTXT to LEVELNAME3 value]) magic 
on s.ORGPATHTXT = magic.ORGPATHTXT
where PERSONNUM != 'UNASSIGNEDSHIFT'
  and s.HOMELABORLEVELNAME2 = '40'
  AND (s.HOMELABORLEVELNAME3 in ('1914','1964','1924','1954', '1944','1934','1554','1564', '1504','5334','2204','3104', '3004','2004','3304','2104', '7554','1754'))
  and paycodename is null
-- AND SHIFTSTARTDATE between '2022-04-29 04:00' and '2022-04-29 11:0
group by 
  HOMELABORLEVELNAME2, 
  COALESCE( magic.HOMELABORLEVELNAME3, s.HOMELABORLEVELNAME3)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM