0

emp_id、headcount、fte、effective_date、status、status_2などの列を持つemployeeテーブルがあります。

開始日と終了日を入力としてレポートを作成する必要があります。これは、effective_dateに対してチェックされます。

入力が日付=2012年1月1日から終了日2013年2月25日までの場合、結果は次の画像に示すように次の形式で表示されます。

ここに画像の説明を入力してください

数値1,0、10、20は、指定された月の人員の合計を示します。

たとえば、発効日が3月の従業員が5人いる場合、3月の列は5人になり、その5人は従業員のstatus列とstatus_2列に基づいて再び分割されます。

たとえば、これらの5つのうち、2はステータスA、status_2 A1 3はステータスA、status_2A2である可能性があります

そのような形式で結果を取得するためのクエリを作成するにはどうすればよいですか?

以下は、employeeテーブルの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 に答える