oracle 带日期和时间的透视

svmlkihl  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(165)

我要查询员工的指纹

SELECT 
bp.Name
vahruae_date date,
to_char(vahruae_timeofattendance, 'hh:mi') Time
FROM vahruae_hr_empattendancelog empl
INNER JOIN c_bpartner bp ON empl.vahruae_enroll_id = bp.enroll_id

值显示如下

Name              Date              Time
-----------------------------------------
John           01-SEP-2022          1:00
John           01-SEP-2022          9:00
John           01-SEP-2022          13:00
John           01-SEP-2022          16:00
John           02-SEP-2022          1:00
John           02-SEP-2022          6:00
John           04-SEP-2022          5:00
.                  .
.                  .
John           31-SEP-2022          4:30
John           31-SEP-2022          7:00
Ali            01-SEP-2022          10:00
Ali            04-SEP-2022          5:00
.                  .
.                  .

我想在一个日期行中显示所有时间,如下所示

Name              Date              Time1           Time2            Time3          Time4
-----------------------------------------------------------------------------------------------
John           01-SEP-2022          1:00            9:00             13:00          16:00
John           02-SEP-2022          1:00            6:00             (null)         (null)
John           04-SEP-2022          5:00           (null)            (null)         (null)
John           31-SEP-2022          4:30            7:00             (null)         (null)
Ali            01-SEP-2022          10:00          (null)            (null)         (null)
Ali            05-SEP-2022          5:00           (null)            (null)         (null)

我不太擅长Pivot,但我知道我不能在Pivot IN Clause中使用subquery
我该怎么做呢?

wgx48brx

wgx48brx1#

使用ROW_NUMBER分析函数为子查询中的时间建立索引,然后使用PIVOT

SELECT name,
       dt,
       time1,
       time2,
       time3,
       time4
FROM   (
  SELECT empl.vahruae_enroll_id,
         bp.Name,
         vahruae_date AS dt,
         to_char(vahruae_timeofattendance, 'hh:mi') AS Time,
         ROW_NUMBER() OVER (
           PARTITION BY empl.vahruae_enroll_id,
                        vahruae_date,
                        TRUNC(vahruae_timeofattendance)
           ORDER BY     vahruae_timeofattendance
         ) AS rn
  FROM   vahruae_hr_empattendancelog empl
         INNER JOIN c_bpartner bp
         ON empl.vahruae_enroll_id = bp.enroll_id
)
PIVOT (
  MAX(time)
  FOR rn IN (1 AS time1, 2 AS time2, 3 AS time3, 4 AS time4)
)
pes8fvy9

pes8fvy92#

我们需要使用row_number()按日期和名称对小时进行编号,然后进行旋转。

select  *
from 
(  
select  "Name"                                                                                                     as "Name"
       ,to_char("Date", 'hh24:mi')                                                                                 as "Time"
       ,to_date(to_char("Date", 'DD-mon-YYYY'))                                                                    as "Date"
       ,row_number() over(partition by "Name", to_char("Date", 'DD-mon-YYYY') order by to_char("Date", 'hh24:mi')) as rn

from   t
) t
pivot(max("Time") for rn in('1' as Time1, '2' as Time2, '3' as Time3, '4' as Time4)) p
order by "Name" desc, "Date"

| 名称名称名称|日期|时间1|时间2|时间3|时间4|
| - -|- -|- -|- -|- -|- -|
| 若翰|2022年9月1日|上午1时|上午9时|13点整|16点整|
| 若翰|2022年9月2日|上午1时|上午6时|零值|零值|
| 若翰|2022年9月4日|05点整|零值|零值|零值|
| 若翰|2022年10月1日|04点半|上午7时|零值|零值|
| 阿里|2022年9月1日|上午10时|零值|零值|零值|
| 阿里|2022年9月4日|05点整|零值|零值|零值|
Fiddle

相关问题