Ireport交叉报表按照数据库表头行排序

注明:页面上table是动态列,第一列是下拉框,IREPORT里显示的顺序要和页面列的顺序已经第一列下拉框里使用数据顺序一致。由于IREPORT里有默认排序,分别是按照首字母升序和降序,所以利用LPAD作填充函数,将基础表的排序字段填充成固定长度,再连接查询字段,最后在IREPORT里利用特殊字符截取,完成排序。
with rowTemp as
(
  SELECT RC.*, MAX(LENGTH(TO_CHAR(RC.SORT_SEQ))) OVER() AS SEQ_MAX_LEN
    FROM REF_CODE RC
   WHERE RC.IND_REC_STATUS = 'A'
     AND RC.CODE_TYPE = 'SITR_VIIMRVESSH_LAUNCH'),
colTemp as
(SELECT RC.*, MAX(LENGTH(TO_CHAR(RC.CODE_KEY))) OVER() AS SEQ_MAX_LEN
    FROM REF_CODE RC
   WHERE RC.IND_REC_STATUS = 'A'
     AND RC.CODE_TYPE = 'SITR_VIIMRVESSH_VESSEL_TYPE'
  ),
CDATA AS
(SELECT *
    from SitRep_VII_Mr_Ves_Sh sh
   where sh.SR_MASTER_ID = 1000040848
     and sh.SR_TREE_ID = 10130
     and sh.IND_REC_STATUS = 'A'),
CDATATTL AS
(SELECT *
    from SitRep_VII_Mr_Ves_Sh_STTL sh
   where sh.SR_MASTER_ID = 1000040848
     and sh.SR_TREE_ID = 10130
     and sh.IND_REC_STATUS = 'A')

SELECT TEAM_MARINE, TYPE_VES, NUM_VES_DAY
  FROM (select LPAD(rowTemp.SORT_SEQ,
                    MAX(LENGTH(TO_CHAR(rowTemp.SORT_SEQ))) OVER(),
                    '0') || '_' || sh.TEAM_MARINE AS TEAM_MARINE,
               LPAD(colTemp.CODE_KEY,
                    MAX(LENGTH(TO_CHAR(colTemp.CODE_KEY))) OVER(),
                    '0') || '_' || sh.TYPE_VES AS TYPE_VES,
               NUM_VES_DAY
          from CDATA sh, rowTemp, colTemp
         where colTemp.CODE_DESCN = sh.type_ves
           and sh.team_marine = rowTemp.Code_Descn
        union all
        select (CASE
                 WHEN TEAM_MARINE = 'Daily' then
                  '990_Daily'
                 WHEN TEAM_MARINE = 'Monthly to-date' THEN
                  '991_Monthly to-date'
                 WHEN TEAM_MARINE = 'Yearly to-date' THEN
                  '992_Yearly to-date'
               END) AS TEAM_MARINE,
               LPAD(colTemp.CODE_KEY,
                    MAX(LENGTH(TO_CHAR(colTemp.CODE_KEY))) OVER(),
                    '0') || '_' || ttl.TYPE_VES AS TYPE_VES,
               (CASE
                 WHEN TEAM_MARINE = 'Daily' then
                  NUM_VES_DAY
                 WHEN TEAM_MARINE = 'Monthly to-date' THEN
                  NUM_VES_TDY_THIS_MTH
                 WHEN TEAM_MARINE = 'Yearly to-date' THEN
                  NUM_VES_TDY_THIS_YEAR
               END) AS NUM_VES_DAY
          from CDATATTL ttl, colTemp
         where colTemp.CODE_DESCN = ttl.type_ves
        union
        select '990_Daily' as TEAM_MARINE,
               LPAD(colTemp.CODE_KEY, colTemp.SEQ_MAX_LEN, '0') || '_' ||
               sh.TYPE_VES as TYPE_VES,
               sum(NUM_VES_DAY) as NUM_VES_DAY
          from CDATA sh, colTemp
         WHERE colTemp.CODE_DESCN = sh.type_ves
         GROUP BY colTemp.CODE_KEY, colTemp.SEQ_MAX_LEN, sh.TYPE_VES
        union
        select '991_Monthly to-date',
               LPAD(colTemp.CODE_KEY,
                    MAX(LENGTH(TO_CHAR(colTemp.CODE_KEY))) OVER(),
                    '0') || '_Other',
               (SELECT NUM_VES_TDY_THIS_MTH FROM CDATATTL
               WHERE  CDATATTL.type_ves = 'Other'
               AND TEAM_MARINE = 'Monthly to-date') AS NUM_VES_DAY
          from colTemp
         where colTemp.Code_Descn = 'Other'
        union
        select '992_Yearly to-date',
               LPAD(colTemp.CODE_KEY,
                    MAX(LENGTH(TO_CHAR(colTemp.CODE_KEY))) OVER(),
                    '0') || '_Other',
               (SELECT NUM_VES_TDY_THIS_YEAR FROM CDATATTL
               WHERE  CDATATTL.type_ves = 'Other'
               AND TEAM_MARINE = 'Yearly to-date') AS NUM_VES_DAY
          from colTemp
         where colTemp.Code_Descn = 'Other')
ORDER BY TEAM_MARINE, TYPE_VES

Ireport截取$V{TEAM_MARINE}.substring($V{TEAM_MARINE}.indexOf("_")+1)

猜你喜欢

转载自youcp999.iteye.com/blog/2339702