【问题标题】:How to convert the data in the rows to columns form?如何将行中的数据转换为列形式?
【发布时间】:2012-11-09 09:02:39
【问题描述】:

我有一个员工表,其中包含 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,status_2 A1 3可能是状态A,status_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
);

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您应该pivot 数据。使用 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' )
       )
    

    你可以学习如何pivot in Oracle previus versions.

    【讨论】:

    • 感谢您的回答。有什么方法可以使数据透视字段列表是动态的,即我会知道开始日期和结束日期,并据此创建数据透视字段列表。
    • 没有直接的方法。您可以挖掘网络搜索以获取动态枢轴。我建议您使用您的语言程序“烹饪”数据透视字段。您使用什么语言从 Oracle 检索数据?
    • java 是我们使用的语言
    • 难道不是我们可以为 effective_date in ( // 一些查询从日期到结束日期之间的所有月份) 做的事情吗?
    • 然后,当你在java中编写查询时,你应该编写两个查询,第一个获取'fields'(select distinct to_char(EFFECTIVE_DATE, 'Mon''YY') as EFFECTIVE_DATE from BI_EMPLOYEE where EFFECTIVE_DATE between ... ),第二个句子是pivot句子。再见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多