Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL将多行聚合为单行_Sql_Oracle - Fatal编程技术网

Oracle SQL将多行聚合为单行

Oracle SQL将多行聚合为单行,sql,oracle,Sql,Oracle,我有一个表格,每个PUNCHDTM格式存储员工打孔的1行。该表有一个SHIFTID来关联属于其班次的所有穿孔,我想要一种方法来获得其自己列中的所有单个穿孔,每个SHIFTID给我一行。我无法确定有多少拳(有些有2拳,有些有10,12°),这让我觉得一些动态的东西会很难。如果不可能动态地获得所有的冲头,那么仅仅抓住前6个冲头就足够了 这是一个示例数据集(我用密集的_秩对每班的打孔次数进行了排序) 员工ID SHIFTID SHIFTDATE PUNCHTM等级 0000016431140051

我有一个表格,每个PUNCHDTM格式存储员工打孔的1行。该表有一个SHIFTID来关联属于其班次的所有穿孔,我想要一种方法来获得其自己列中的所有单个穿孔,每个SHIFTID给我一行。我无法确定有多少拳(有些有2拳,有些有10,12°),这让我觉得一些动态的东西会很难。如果不可能动态地获得所有的冲头,那么仅仅抓住前6个冲头就足够了

这是一个示例数据集(我用密集的_秩对每班的打孔次数进行了排序)


员工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