2009-06-10 11 views
0

Supposons que vous avez 2 colonnes que vous groupez par et obtenir un compte:Besoin d'aide dans la requête complexe sql

select col1, col2, count(*) 
from yourtable 
group by col1, col2 

Votre col2 sera unique, mais vous aurez répété années col1. Pour éviter cela, vous pouvez:

select decode(lag(col1,1,0) over (order by col1),col1,' ',col1) col1, col2, cnt 
from 
(select col1, col2, count(*) cnt 
from yourtable 
group by col1, col2) 

Cela comparer la valeur avant - lag (col1,1,0) plus (commande par col1) - avec la valeur actuelle. S'il est identique, il renvoie un blanc à la place.


Ma question

Je suis en train d'écrire un SELECT comme ci-dessous pour afficher les données dans le format donné à la fin de la question. Son ne fonctionne pas, s'il vous plaît aider

SELECT DECODE (LAG (firstname, 1, 0) OVER (ORDER BY firstname), 
       firstname, ' ', 
       firstname 
      ) firstname, 
     DECODE (LAG (emplid, 1, 0) OVER (ORDER BY emplid), 
       emplid, ' ', 
       emplid 
      ) emplid, 
     DECODE (LAG (tplan_name, 1, 0) OVER (ORDER BY tplan_name), 
       tplan_name, ' ', 
       tplan_name 
      ) tplan_name, 
    completed_cdt_act,    ----->This is 1 more calculated field corresponding to each TPLAN_NAME 

     DECODE (LAG (t_objective_id, 1, 0) OVER (ORDER BY t_objective_id), 
       t_objective_id, ' ', 
       t_objective_id 
      ) t_objective_id, 
     completed_activities 
    FROM (SELECT test_cp.firstname, test_op.emplid,tp.tplan_name, 
      fn_tp_get_cmpltd_act_cnt (tp.tplan_id, 
           test_cp.person_id, 
           test_o.org_id 
           ) completed_cdt_act, 
       test_tpo.t_objective_id, 
       ( fn_tp_obj_comp_req_act_cdt (test_lp.lp_person_id, 
               tp.tplan_id, 
               test_tpo.t_objective_id, 
               tp.is_credit_based 
              ) 
       + fn_tp_obj_comp_opt_act_cdt (test_lp.lp_person_id, 
               tp.tplan_id, 
               test_tpo.t_objective_id, 
               tp.is_credit_based 
              ) 
       ) completed_activities, 
       tpobjact.activity_id activity_id, -----> Again ,each objective_id we select CAN have multiple activity_ids.The remaining fields gives the activity_name,their status 

      lr.catalog_item_name, 
     fn_tp_get_act_type (tpobjact.is_preferred, 
          tpobjact.is_required) status, 
     lr.catalog_item_type activity_type, lr.delivery_method, lr.status status1, 
      FROM test_learning_plan test_lp, 
       test_training_plan tp, 
       test_person test_cp, 
       test_org_person test_op, 
       test_org test_o 
       test_tp_objective test_tpo, 
       test_train_obj_activity tpobjact, 

     test_learning_record lr, 
     test_training_objective obj, 
     WHERE test_lp.lp_person_id = '1' 
      AND test_cp.person_id = test_lp.lp_person_id 
      AND tp.tplan_id = test_lp.lp_catalog_hist_id 
      AND test_op.o_person_id = test_cp.person_id 
      and test_o.org_id = test_op.O_ORG_ID 
      AND test_tpo.tplan_id = tp.tplan_id 
      and lr.tp_ref_lp_id = test_lp.learning_plan_id 
    AND lr.lr_catalog_history_id = tpobjact.activity_id 


    AND tpobjact.t_objective_id = test_tpo.t_objective_id); 





****************************************************************************************************** 
The display format is something like this. 

firstname emplid Tplan name completed(for TP) Objective Name Credits (for objective) Number of activities completed(for objective) activity                                                           name activity completion status 

U1 U1     TP1          5     
                      OBJ1      4       3         C1   PASSED 
                                           C2  PASSED 
                                           C3 WAIVED 
          T1 ENROLLED 
          T2 ENROLLED 
                       OBJ2 3    2   
                         S1 ENROLLED 
          S2 PASSED 
          T3 WAIVED 
U1 U1 TP2     C4 INPROGRESS 
      50 OBJ11 50 30 C11 PASSED 
          C22 PASSED 
          C33 WAIVED 
          T11 ENROLLED 
          T22 ENROLLED 
       OBJ22 40 20  
          S11 ENROLLED 
          S22 PASSED 

Répondre

0

Je pense que la meilleure façon de procéder est de simplifier les choses.

Commencez ainsi.

1) Qu'est-ce que voulez-vous afficher - à savoir quelle est la liste des

Si vous voulez une liste des employés avec « des choses » contre chaque employé, puis d'écrire un script qui obtient juste la liste des employés .

2) Ajouter un peu de complexité

Si vous avez besoin de connaître le « nombre de quelque chose » un employé a fait, ajouter que. Vous avez la possibilité de a) Joignez-vous aux tables et utiliser le regroupement b) effectuer une déclaration de sous-sélection pour obtenir simplement la valeur. Votre choix dépendra des considérations de performance.

3) Vous avez réussi? Ajoutez un peu plus de complexité - quelle est la prochaine chose dont vous avez besoin pour chaque employé que vous devez obtenir ... (c'est-à-dire que vous devez ajouter chaque élément complexe, sachant que cela fonctionne à chaque étape).

+0

Merci beaucoup pour le guidage.J'ai travaillé sur l'ajout graduel d'une table après l'autre exactement comme les données sont requises par étapes.Mais, encore, je suis confronté à des problèmes avec leur affichage. Je sais quelles sont les données à sélectionner mais je suis bloqué car ces données sélectionnées doivent s'afficher dans un format particulier donné. J'ai également utilisé LAG avec décodage pour obtenir cet affichage requis et éliminer les valeurs répétées. Mais, il y a encore beaucoup de problèmes que je ne suis pas capable de faire et je vous serais reconnaissant de regarder mon SELECT ci-dessus. pour obtenir l'affichage si nécessaire. Merci encore –