Oracle SQL将多行聚合为单行
我有一个表格,每个PUNCHDTM格式存储员工打孔的1行。该表有一个SHIFTID来关联属于其班次的所有穿孔,我想要一种方法来获得其自己列中的所有单个穿孔,每个SHIFTID给我一行。我无法确定有多少拳(有些有2拳,有些有10,12°),这让我觉得一些动态的东西会很难。如果不可能动态地获得所有的冲头,那么仅仅抓住前6个冲头就足够了 这是一个示例数据集(我用密集的_秩对每班的打孔次数进行了排序)Oracle SQL将多行聚合为单行,sql,oracle,Sql,Oracle,我有一个表格,每个PUNCHDTM格式存储员工打孔的1行。该表有一个SHIFTID来关联属于其班次的所有穿孔,我想要一种方法来获得其自己列中的所有单个穿孔,每个SHIFTID给我一行。我无法确定有多少拳(有些有2拳,有些有10,12°),这让我觉得一些动态的东西会很难。如果不可能动态地获得所有的冲头,那么仅仅抓住前6个冲头就足够了 这是一个示例数据集(我用密集的_秩对每班的打孔次数进行了排序) 员工ID SHIFTID SHIFTDATE PUNCHTM等级 0000016431140051
员工ID SHIFTID SHIFTDATE PUNCHTM等级
0000016431140051010/16/2017 10/16/2017 03:29下午1点
0000016431140051010/16/2017 10/16/2017 08:02下午2点
0000016431140051010/16/2017 10/16/2017 08:32下午3点
0000016431140051010/16/2017 10/16/2017 10:30下午4点
0000016431140458110/17/2017 10/17/2017 02:57下午1点
0000016431140458110/17/2017 10/17/2017 07:20下午2点
正如您所说,很难动态执行此操作,因为它需要硬编码。但你肯定可以打6拳:
select EMPLOYEEID
, SHIFTID
, SHIFTDATE
, max(case when rank = 1 then PUNCHDTM else null end) as PUNCHDTM1
, max(case when rank = 2 then PUNCHDTM else null end) as PUNCHDTM2
, max(case when rank = 3 then PUNCHDTM else null end) as PUNCHDTM3
, max(case when rank = 4 then PUNCHDTM else null end) as PUNCHDTM4
, max(case when rank = 5 then PUNCHDTM else null end) as PUNCHDTM5
, max(case when rank = 6 then PUNCHDTM else null end) as PUNCHDTM6
from employees
group by 1,2,3
就像你说的,动态地做这件事很难,因为它需要硬编码。但你肯定可以打6拳:
select EMPLOYEEID
, SHIFTID
, SHIFTDATE
, max(case when rank = 1 then PUNCHDTM else null end) as PUNCHDTM1
, max(case when rank = 2 then PUNCHDTM else null end) as PUNCHDTM2
, max(case when rank = 3 then PUNCHDTM else null end) as PUNCHDTM3
, max(case when rank = 4 then PUNCHDTM else null end) as PUNCHDTM4
, max(case when rank = 5 then PUNCHDTM else null end) as PUNCHDTM5
, max(case when rank = 6 then PUNCHDTM else null end) as PUNCHDTM6
from employees
group by 1,2,3