2010-11-19 5 views
0

J'ai ensemble de données qui devraient être chercher dans et établir un rapport dans l'ordre suivantORDER BY question sur 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 

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

Dans ce que nous pouvons voir qu'un 3 code lettre [extrait du code d'emplacement - CONCAT (SUBSTR (COLONNE3,3,3), 'Total')] après tous les emplacements définis. Je viens juste de trouver le rapport et ça marche, sauf dans le cas de l'ordre décroissant du code de localisation. Il utilise 'emplacement' pour commander après l'avoir fait dans le code de 3 lettres au lieu d'utiliser le code numérique complet. Donc, dans le résultat, l'ordre décroissant ne fonctionne pas bien comme j'ai besoin. S'il vous plaît me donner une solution,

Je joins mon code,

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

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; 


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

Merci Anand

Répondre

1

Je vous suggère de modifier la requête à

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; 

Ce que nous essayons faire ici est d'ajouter l'emplacement complet (COLUMN3 dans vos données, si je lis la requête d'origine correctement) à la requête de sorte que le tri peut être basé sur elle. Vous devrez peut-être modifier les GROUP BY - Je ne suis pas sûr et n'ai pas vos données disponibles pour tester avec. Mais c'est l'idée de base.

Partagez et appréciez.

+2

Je recommanderais d'utiliser 'union all' plutôt que' union', sauf s'il y a une bonne raison, puisque 'union' est identique à faire' union all' suivi de 'select distinct' –

+0

@MikeyByCrikey - excellent point. Mise à jour ma réponse. –

+0

merci Bob Jarvis .. merci beaucoup .. il a travaillé !! – Anand

0

Je recommanderais d'examiner les ensembles de regroupement plutôt que d'utiliser des données de regroupement. Les ensembles de regroupement (avec CUBE et ROLLUP) sont des moyens d'agréger des données à plusieurs niveaux, ce que vous semblez faire. Utiliser les ensembles de regroupement obtiendra les données que vous recherchez.

Pour trier les données, vous devez ajouter des colonnes supplémentaires à la clause order by. La fonction grouping_id() que j'ai utilisée renvoie un nombre (0 ou 1) selon qu'il s'agit d'une ligne 'superagrégée' ou non pour l'expression donnée. Ces lignes "superagrégées" sont les lignes supplémentaires qui se rapportent aux totaux et sous-totaux. Je trier sur les données et sur si la colonne est un super-agrégé ou non.

que vous devriez être en mesure de faire quelque chose comme:

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 

courrons espérons-le plus rapide et faire ce que vous voulez. J'aurais peut-être rendu l'ordre par article plus compliqué que nécessaire mais il devrait faire ce dont vous avez besoin.