0

我有一个员工表,其中包含 emp_id、headcount、fte、effective_date、status、status_2 等列。

我需要创建一个以起始日期和结束日期为输入的报告。这将根据有效日期进行检查。

如果输入是从日期 = 2012 年 1 月 1 日到结束日期 2013 年 2 月 25 日,则结果应以如下格式显示,如下图所示。

在此处输入图像描述

数字 1,0,10,20 表示指定月份的总人数。

例如,如果 3 月份有 5 名员工的生效日期,则 3 月份的列中将有 5 名,然后这 5 名员工将根据员工的 status 和 status_2 列再次拆分。

例如,在这 5 个中,2 个可能是状态 A,状态_2 A1 3 可能是状态 A,状态_2 A2

如何编写查询以获取这种格式的结果?

下面是员工表的 DDL。

--------------------------------------------------------
--  DDL for Table BI_EMPLOYEE
--------------------------------------------------------

CREATE TABLE "HEADCOUNT_BI"."BI_EMPLOYEE" 
(   
    "EMP_ID" NUMBER(*,0) NOT NULL ENABLE, 
    "STATUS" NUMBER(*,0), 
    "STATUS_2" NUMBER(*,0), 
    "FTE" FLOAT(126), 
    "EFFECTIVE_DATE" DATE, 
    "HEADCOUNT" NUMBER(*,0), 
    CONSTRAINT "HEADCOUNT_EMPLOYEE_BI_PK" PRIMARY KEY ("EMP_ID") ENABLE
);
4

1 回答 1

1

您应该透视数据。使用 Oracle 11:

SELECT 
   *
FROM   
   ( select 
       status, status_2,to_char(EFFECTIVE_DATE,  'Mon''DD') as EFFECTIVE_DATE,
       sum( HEADCOUNT ) as HEADCOUNT
     from "BI_EMPLOYEE" 
     group by status, status_2,EFFECTIVE_DATE
   )
PIVOT  
   (
    sum(HEADCOUNT) 
    for  EFFECTIVE_DATE in  ( 'Jan''12', 'Feb''12' )
   )

请注意,数据透视字段列表必须是一个常量。

已编辑,此时我看到您按月而不是按天汇总

SELECT 
   *
FROM   
   ( select 
       status, status_2,to_char(EFFECTIVE_DATE,  'Mon''YY') as EFFECTIVE_DATE,
       sum( HEADCOUNT ) as HEADCOUNT
     from "BI_EMPLOYEE" 
     group by status, status_2, to_char(EFFECTIVE_DATE,  'Mon''YY') 
   )
PIVOT  
   (
    sum(HEADCOUNT) 
    for  EFFECTIVE_DATE in  ( 'Jan''12', 'Feb''12' )
   )

您可以了解如何在 Oracle 以前的版本中进行数据透视。

于 2012-11-21T07:16:16.850 回答