2010-11-19 75 views
0
问题

我已经设置的数据应取出来,应该按以下顺序ORDER BY上PLSQL

Last Name  First Name  Location 
Blake   James   101007 
fusio   Wiko   101008 
        100 Total 

FAROMOJU  BANKOLE   303315 
Gibbs   Rhonda   303315 
Greene   Leette   303315 
        331 Total 

...... 
............ 

在该准备一份报告,我们可以看到,3字母代码 [从提取位置代码 - CONCAT(SUBSTR(COLUMN3,3,3),'Total')]在所有位置设置后。我只是想出报告,除了地点代码降序的情况外,它工作得很好。它使用'位置'进行排序后,将其转换为3个字母的代码,而不是使用完整的数字代码。所以在结果中降序不能很好地工作,因为我需要。请给我一个解决方案,

我附上我的代码,

****************************************************** 

FUNCTION GET_ACTY_SUMMARY(V_STARTDATE IN DATE,V_ENDDATE IN DATE) 
RETURN TEMP_OUTPUT_TABLE PIPELINED IS 
CURSOR ACTY_SUMMARY IS 

/* The query fetches the report field grouped by First Name,Last Name 
and Location.*/ 

    SELECT 
      COLUMN1 AS LASTNAME, 
      COLUMN2 AS FIRSTNAME, 
      COLUMN3 AS LOCATION, 
      SUM(COLUMN4) AS ACTIVITYNM1, 
      SUM(COLUMN5) AS ACTIVITYNM2, 
      SUM(COLUMN6) AS ACTIVITYNM3, 
      SUM(COLUMN7) AS ACTIVITYNM4, 
      SUM(COLUMN8) AS ACTIVITYNM5, 
      SUM(COLUMN9) AS REG_HRS, 
      SUM(COLUMN10) AS OT_HRS, 
      SUM(COLUMN11) AS TOTAL_HRS, 
      SUM(COLUMN12) AS PRODUCTIVITY_PERCENTAGE 

    FROM 
    TABLE(ACTY_COLUMN(V_STARTDATE,V_ENDDATE)) 
    GROUP BY 
    COLUMN1, 
    COLUMN2, 
    COLUMN3 


    UNION 

    SELECT NULL, 
     NULL, 
     CONCAT(SUBSTR(COLUMN3,3,3),'Total'), 
     SUM(COLUMN4) AS ACTIVITYNM1, 
     SUM(COLUMN5) AS ACTIVITYNM2, 
     SUM(COLUMN6) AS ACTIVITYNM3, 
     SUM(COLUMN7) AS ACTIVITYNM4, 
     SUM(COLUMN8) AS ACTIVITYNM5, 
     SUM(COLUMN9) AS REG_HRS, 
     SUM(COLUMN10) AS OT_HRS, 
     SUM(COLUMN11) AS TOTAL_HRS, 
     SUM(COLUMN12) AS PRODUCTIVITY_PERCENTAGE 

    FROM TABLE(ACTY_COLUMN(V_STARTDATE,V_ENDDATE)) 
    GROUP BY COLUMN3 
    UNION 

    SELECT NULL, 
     NULL, 
     'Total', 
     SUM(COLUMN4) AS ACTIVITYNM1, 
     SUM(COLUMN5) AS ACTIVITYNM2, 
     SUM(COLUMN6) AS ACTIVITYNM3, 
     SUM(COLUMN7) AS ACTIVITYNM4, 
     SUM(COLUMN8) AS ACTIVITYNM5, 
     SUM(COLUMN9) AS REG_HRS, 
     SUM(COLUMN10) AS OT_HRS, 
     SUM(COLUMN11) AS TOTAL_HRS, 
     SUM(COLUMN12) AS PRODUCTIVITY_PERCENTAGE 

    FROM TABLE(ACTY_COLUMN(V_STARTDATE,V_ENDDATE)) 


    ORDER BY 3 desc ; 

GAS ACTY_SUMMARY%ROWTYPE; 

/*Intialize the table output format with NULL.*/ 

TT TEMP_OUTPUT_FORMAT := INITIALIZE_TABLE_FORMAT(); 
    BEGIN 
    OPEN ACTY_SUMMARY; 
    FETCH ACTY_SUMMARY INTO GAS; 
    WHILE ACTY_SUMMARY%FOUND LOOP 
     BEGIN 
     TT.COLUMN1 := GAS.LASTNAME; 
     TT.COLUMN2 := GAS.FIRSTNAME; 
     TT.COLUMN3 := GAS.LOCATION; 
     TT.COLUMN4 := GAS.ACTIVITYNM1; 
     TT.COLUMN5 := GAS.ACTIVITYNM2; 
     TT.COLUMN6 := GAS.ACTIVITYNM3; 
     TT.COLUMN7 := GAS.ACTIVITYNM4; 
     TT.COLUMN8 := GAS.ACTIVITYNM5; 
     TT.COLUMN9 := GAS.REG_HRS; 
     TT.COLUMN10 := GAS.OT_HRS; 
     TT.COLUMN11 := GAS.TOTAL_HRS; 
     TT.COLUMN12 := GAS.PRODUCTIVITY_PERCENTAGE; 
     PIPE ROW(TT); 
    END; 
    FETCH ACTY_SUMMARY INTO GAS; 
    END LOOP; 
    CLOSE ACTY_SUMMARY; 
    RETURN; 
END GET_ACTY_SUMMARY; 

END GEHC_ACTY_REPT_PKG; 


****************************************************** 

感谢 阿南德

回答

1

我建议你更改查询是

SELECT 
      COLUMN1 AS LASTNAME, 
      COLUMN2 AS FIRSTNAME, 
      COLUMN3 AS LOCATION, 
      COLUMN3 AS FULL_LOCATION, 
      SUM(COLUMN4) AS ACTIVITYNM1, 
      SUM(COLUMN5) AS ACTIVITYNM2, 
      SUM(COLUMN6) AS ACTIVITYNM3, 
      SUM(COLUMN7) AS ACTIVITYNM4, 
      SUM(COLUMN8) AS ACTIVITYNM5, 
      SUM(COLUMN9) AS REG_HRS, 
      SUM(COLUMN10) AS OT_HRS, 
      SUM(COLUMN11) AS TOTAL_HRS, 
      SUM(COLUMN12) AS PRODUCTIVITY_PERCENTAGE 
    FROM TABLE(ACTY_COLUMN(V_STARTDATE,V_ENDDATE)) 
    GROUP BY 
    COLUMN1, 
    COLUMN2, 
    COLUMN3 
UNION ALL 
    SELECT NULL, 
     NULL, 
     CONCAT(SUBSTR(COLUMN3,3,3),'Total'), 
     COLUMN3 AS FULL_LOCATION, 
     SUM(COLUMN4) AS ACTIVITYNM1, 
     SUM(COLUMN5) AS ACTIVITYNM2, 
     SUM(COLUMN6) AS ACTIVITYNM3, 
     SUM(COLUMN7) AS ACTIVITYNM4, 
     SUM(COLUMN8) AS ACTIVITYNM5, 
     SUM(COLUMN9) AS REG_HRS, 
     SUM(COLUMN10) AS OT_HRS, 
     SUM(COLUMN11) AS TOTAL_HRS, 
     SUM(COLUMN12) AS PRODUCTIVITY_PERCENTAGE 
    FROM TABLE(ACTY_COLUMN(V_STARTDATE,V_ENDDATE)) 
    GROUP BY COLUMN3 
UNION ALL 
    SELECT NULL, 
     NULL, 
     'Total', 
     'Total' AS FULL_LOCATION, 
     SUM(COLUMN4) AS ACTIVITYNM1, 
     SUM(COLUMN5) AS ACTIVITYNM2, 
     SUM(COLUMN6) AS ACTIVITYNM3, 
     SUM(COLUMN7) AS ACTIVITYNM4, 
     SUM(COLUMN8) AS ACTIVITYNM5, 
     SUM(COLUMN9) AS REG_HRS, 
     SUM(COLUMN10) AS OT_HRS, 
     SUM(COLUMN11) AS TOTAL_HRS, 
     SUM(COLUMN12) AS PRODUCTIVITY_PERCENTAGE 
    FROM TABLE(ACTY_COLUMN(V_STARTDATE,V_ENDDATE)) 
    ORDER BY 4 DESC; 

我们正在试图这里要做的是在查询中添加完整的位置(数据中的COLUMN3,如果我正在读取原始查询),以便排序可以基于它。您可能需要更改GROUP BY的 - 我不确定,也没有可供您测试的数据。但这是基本的想法。

分享和享受。

+2

我会推荐使用'union all'而不是'union',除非有很好的理由,因为'union'和'union all'是一样的,后面是'select distinct' – 2010-11-19 14:32:42

+0

@MikeyByCrikey - 优秀点。更新了我的回复。 – 2010-11-19 15:27:11

+0

谢谢鲍勃贾维斯..非常感谢..它的工作! – Anand 2010-11-22 11:35:59

0

我会建议看看分组集,而不是使用联合数据在一起。分组集(与CUBEROLLUP一起)是汇总多个级别的数据的方法,这是您似乎在做的事情。使用分组集合将获得您正在查找的数据。

为了排序数据,您需要向order by子句添加其他列。我使用的grouping_id()函数返回一个数字(0或1),这取决于它是否是给定表达式的'superaggregate'行。这些'superaggregate'行是与总计和小计相关的附加行。我正在对数据进行排序以及该列是否是超级聚集的。

认为你应该能够做到像:

SELECT 
    COLUMN1 AS LASTNAME, 
    COLUMN2 AS FIRSTNAME, 
    case 
    when grouping_id(column3, substr(column3,3,3)) = 3 then 'Total' 
    when grouping_id(column3, substr(column3,3,3)) = 2 
     then substr(column3,3,3) ||' Total' 
    else column3 end as location, 
    SUM(COLUMN4) AS ACTIVITYNM1, 
    SUM(COLUMN5) AS ACTIVITYNM2, 
    SUM(COLUMN6) AS ACTIVITYNM3, 
    SUM(COLUMN7) AS ACTIVITYNM4, 
    SUM(COLUMN8) AS ACTIVITYNM5, 
    SUM(COLUMN9) AS REG_HRS, 
    SUM(COLUMN10) AS OT_HRS, 
    SUM(COLUMN11) AS TOTAL_HRS, 
    SUM(COLUMN12) AS PRODUCTIVITY_PERCENTAGE 
FROM TABLE(ACTY_COLUMN(V_STARTDATE,V_ENDDATE)) 
GROUP BY grouping sets ((), (substr(column3,3,3)), 
    (COLUMN1,COLUMN2,COLUMN3, substr(column3,3,3))) 
order by 
    grouping_id(substr(column3,3,3)), 
    substr(column3,3,3) desc, 
    grouping_id(column3, substr(column3,3,3)), 
    column3 desc 

有望运行更快,做你想做的。我可能已经使order by子句比必要的更复杂,但它应该做你需要的。