2010-11-19 81 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子句比必要的更復雜,但它應該做你需要的。