Oracle帮助:计算一个表中的行在另一个表中的两个日期之间的数量

jecbmhm3  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(109)

一个完全被卡住的甲骨文新手我试图计算另一个表中两个日期之间的项目数。例如,我有一个Staff表,其中包含人员以及他们的打卡时间。
工作人员
| 名称|时钟输入|
| --|--|
| 比利|2023-09-26T07:30:35-05:00|
| 戴夫|2023-09-26T09:45:34-05:00|
| Sara| 2023-09-27T00:30:07-05:00|
| 冬青|2023-09-27T07:30:14-05:00|
| 丹|2023-09-27T10:30:52-05:00|
| 伊娃|2023-09-28T01:15:30-05:00|
下一个表有轮班是什么,轮班什么时候开始,下一个轮班什么时候开始,以及它的工作日期福尔斯。
活动日历
| 移位|开始时间|下一页_开始_开始|工作日期|
| --|--|--|--|
| 天|2023-09-26T06:15:00-05:00| 2023-09-26T18:15:00-05:00| 2023-09-26T00:00:00-05:00|
| 晚上|2023-09-26T18:15:00-05:00| 2023-09-27T06:15:00-05:00| 2023-09-26T00:00:00-05:00|
| 天|2023-09-27T06:15:00-05:00| 2023-09-27T18:15:00-05:00| 2023-09-27T00:00:00-05:00|
| 晚上|2023-09-27T18:15:00-05:00| 2023-09-28T06:15:00-05:00| 2023-09-27T00:00:00-05:00|
我希望的结果是
| 日期|移位|工作人员人数|
| --|--|--|
| 2023-09-26|天| 2 |
| 2023-09-26|晚上| 1 |
| 2023-09-27 2023-09-27|天| 1 |
| 2023-09-27 2023-09-27|晚上| 2 |
其中,比利和戴夫在2023年9月26日上白班,萨拉在2023年9月26日上夜班,尽管她在2023年9月27日午夜打卡上班,冬青在2023年9月27日上白班,丹和伊娃在2023年9月27日上夜班,尽管伊娃在2023年9月28日凌晨1:15打卡上班。
我正在处理的数据要大得多,可以追溯到3年前,所以手动输入每个日期并不是一个正确的选择,但这给了我一个想法,我试图完成。我不能隐瞒任何事。
任何帮助都是感激不尽的。
到目前为止,我没有尝试过任何方法,但就像我说的,我是一个完全的新手。

j5fpnvbx

j5fpnvbx1#

一个子查询可以解决这个问题。例如:

SELECT to_char(c.DATE, 'MM/DD/YYYY') AS ShiftDate,
       c.SHIFT AS ShiftDay,
          (SELECT COUNT(NAME)
           FROM STAFF s
           WHERE s.CLOCK_IN >= c.START_TIME
           AND s.CLOCK_IN <= c.NEXT_SHIFT_START) 
        AS NO_OF_STAFF
FROM SHIFT_CALENDAR c
ORDER BY ShiftDate, ShiftDay

您可能希望调整搜索时间,以考虑员工提前到达他们正在工作的班次(这种情况发生过吗?))🤣。

6mw9ycah

6mw9ycah2#

你可以使用outer apply来实现:

select
   trunc(sc.WORK_DATE,'dd') as "DATE"
  ,sc.SHIFT
  ,v.*
from SHIFT_CALENDAR sc
    outer apply (
        select count(*) as NO_OF_STAFF
               ,listagg(s.name,',') names
        from STAFF s
        where s.CLOCK_IN between sc.START_TIME and sc.NEXT_SHIFT_START
    ) v

DBFiddle:https://dbfiddle.uk/0sHM9gnK
完整的测试数据示例:

with
 STAFF(NAME, CLOCK_IN) as (
    select 'BILLY', to_timestamp_tz('2023-09-26T07:30:35-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') from dual union all
    select 'DAVE' , to_timestamp_tz('2023-09-26T09:45:34-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') from dual union all
    select 'SARA' , to_timestamp_tz('2023-09-27T00:30:07-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') from dual union all
    select 'HOLLY', to_timestamp_tz('2023-09-27T07:30:14-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') from dual union all
    select 'DAN'  , to_timestamp_tz('2023-09-27T10:30:52-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') from dual union all
    select 'EVA'  , to_timestamp_tz('2023-09-28T01:15:30-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') from dual
)
,SHIFT_CALENDAR(SHIFT, START_TIME, NEXT_SHIFT_START, WORK_DATE) as (
    select 'DAY  ', to_timestamp_tz('2023-09-26T06:15:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'), to_timestamp_tz('2023-09-26T18:15:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'), to_timestamp_tz('2023-09-26T00:00:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') from dual union all
    select 'NIGHT', to_timestamp_tz('2023-09-26T18:15:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'), to_timestamp_tz('2023-09-27T06:15:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'), to_timestamp_tz('2023-09-26T00:00:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') from dual union all
    select 'DAY  ', to_timestamp_tz('2023-09-27T06:15:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'), to_timestamp_tz('2023-09-27T18:15:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'), to_timestamp_tz('2023-09-27T00:00:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') from dual union all
    select 'NIGHT', to_timestamp_tz('2023-09-27T18:15:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'), to_timestamp_tz('2023-09-28T06:15:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM'), to_timestamp_tz('2023-09-27T00:00:00-05:00','yyyy-mm-dd"T"hh24:mi:ssTZH:TZM') from dual
)
select
   trunc(sc.WORK_DATE,'dd') as "DATE"
  ,sc.SHIFT
  ,v.*
from SHIFT_CALENDAR sc
    outer apply (
        select count(*) as NO_OF_STAFF
               ,listagg(s.name,',') names
        from STAFF s
        where s.CLOCK_IN between sc.START_TIME and sc.NEXT_SHIFT_START
    ) v

相关问题