sql查询帮助下表

时间:2012-07-24 12:02:57

标签: oracle11g

我的表结构是: table_system:

"ID"               NUMBER NOT NULL ENABLE,
"COUNTRY"          VARCHAR2(10 BYTE) NOT NULL ENABLE,
"COMPANYCODE"      VARCHAR2(50 BYTE) NOT NULL ENABLE,
"SYSTEM"           VARCHAR2(50 BYTE) NOT NULL ENABLE,
"NOTSTARTED"       NUMBER,
"RUNNING"          NUMBER,
"COMPLETED"        NUMBER,
"ACTUALSTARTTIME"  VARCHAR2(5 BYTE),
"ACTUALENDTIME"    VARCHAR2(5 BYTE),
"SEQUENCE"         NUMBER,
"PLANNEDSTARTTIME" VARCHAR2(5 BYTE),
"PLANNEDENDTIME"   VARCHAR2(5 BYTE),
"ESTIMATEDENDTIME" VARCHAR2(5 BYTE),
CONSTRAINT "SYSTEMRUNTIME_PK" PRIMARY KEY ("ID", "COUNTRY", "COMPANYCODE", "SYSTEM") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "SYSTEM" ENABLE

我需要一个输出来获取以下输出:

COMPANYCODE                                         SYSTEM1 SYSTEM2 SYSTEM3 SYSTEM4 SYSTEM5 SYSTEM6 SYSTEM7 SYSTEM8 …   SYSTEM N
--------------------------------------------------  --------------------------- ------------------- ----------------------- ------------------------------  ------------------------------  --------------------    --------------  --------------  --------------  --------------

其中系统按照“SEQUENCE”属性进行排序。

我试过这个问题:

    select distinct companycode, sequence, system,notstarted,running,completed
    from table_system
    where id = (select max(id) from table_system)
    order by companycode, sequence

这让我抓住了以下内容

COMPANYCODE SEQUENCE    SYSTEM  NOTSTARTED  RUNNING COMPLETED
--------------------------------------------------  ----------------------  --------------------------------------------------  ----------------------  ----------------------  ----------------------
1001 Helsinki Branch    1   GAP 2 / Datastage GL    0   0   3
1001 Helsinki Branch    2   SAP GL  0   0   2
1001 Helsinki Branch    3   SAP BW  0   0   2
1002 Copenhagen Branch  1   GAP 2 / Datastage GL    0   0   3
1002 Copenhagen Branch  2   SAP GL  0   0   2
1002 Copenhagen Branch  3   SAP BW  0   0   2
1003 Oslo Branch    1   GAP 2 / Datastage GL    0   0   3
1003 Oslo Branch    2   SAP GL  0   0   2
1003 Oslo Branch    3   SAP BW  0   0   2
1004 (publ) (EUR)   1   EKO 0   0   13
1004 (publ) (EUR)   2   HA Core 0   0   6
1004 (publ) (EUR)   3   HA Post Processor   0   0   5
1004 (publ) (EUR)   4   Datastage GL    3   0   10
1004 (publ) (EUR)   5   Datastage Recon 1   0   3
1004 (publ) (EUR)   11  SAP GL  0   0   4
1004 (publ) (EUR)   21  SAP BW  0   0   4

但我希望输出为:

COMPANYCODE                                         SYSTEM1 SYSTEM2 SYSTEM3 SYSTEM4 SYSTEM5 SYSTEM6 SYSTEM7 SYSTEM8 …   SYSTEM N
--------------------------------------------------  --------------------------- ------------------- ----------------------- ------------------------------  ------------------------------  --------------------    --------------  --------------  --------------  --------------
1001 Helsinki Branch            GAP 2 / Datastage GL    SAP GL  SAP BW                          
1002 Copenhagen Branch          GAP 2 / Datastage GL    SAP GL  SAP BW                          
1003 Oslo Branch                GAP 2 / Datastage GL    SAP GL  SAP BW                          
1004 (publ) (EUR)                       EKO HA Core HA Post Processor   Datastage GL    Datastage Recon SAP GL  SAP BW      

上述任何提示都将受到高度赞赏。 谢谢 维纳亚克

2 个答案:

答案 0 :(得分:0)

试试:

select companycode, COLLECT(system) as systems
    from table_system
    where id = (select max(id) from table_system)    
    group by companycode
    order by companycode, sequence

答案 1 :(得分:0)

您可以使用pivot操作;但是不能处理未知数量的系统(因为您需要知道解析时所选列的数量):

select * from
(
    select companycode, system,
        row_number() over (partition by id, country, companycode
            order by sequence) as rn
    from table_system
    where id = (select max(id) from table_system)
)
pivot (max(system) for rn in (1 as system1, 2 as system2, 3 as system3,
    4 as system4, 5 as system5, 6 as system6, 7 as system7, 8 as system8))
order by company code;


COMPANYCODE                                        SYSTEM1                                            SYSTEM2                                            SYSTEM3                                            SYSTEM4                                            SYSTEM5                                            SYSTEM6                                            SYSTEM7                                            SYSTEM8
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
1001 Helsinki Branch                               GAP 2 / Datastage GL                               SAP GL                                             SAP BW
1002 Copenhagen Branch                             GAP 2 / Datastage GL                               SAP GL                                             SAP BW
1003 Oslo Branch                                   GAP 2 / Datastage GL                               SAP GL                                             SAP BW
1004 (publ) (EUR)                                  EKO                                                HA Core                                            HA Post Processor                                  Datastage GL                                       Datastage Recon                                    SAP GL                                             SAP BW

因此,您需要确定您将要出现的最大系统数,并向枢轴(9 as system9, ...)添加子句以适应所有这些系统。 row_number()将序列号转换为连续的数字,因此公司1004的第5和第6系统之间没有很大差距;除了其他任何东西,你需要枢轴来处理最大可能的序列号而不是系统的最大数量。