2017-06-12 6 views
1
  1. J'ai une table qui contient des heures quotidiennes Lun-Sol, j'ai une fonction qui calcule et retourne le total hebdomadaire. Je les additionne en fonction de la semaine en cours et de la partition par les éléments element_id et start_date appelant le résultat WEEK_HRS_TOTAL.

Cela donne un total pour chaque semaine.Le résultat de DENSE_RANK() peut-il être utilisé dans un SUM de l'instruction select actuelle

SUM(GENERATED_FOR_WEEK(et.START_DATE, et.END_DATE, elm.element_id, MON...SUN_)) OVER(PARTITION BY elm.element_id, et.START_DATE)as WEEK_HRS_TOTAL 
  1. J'ai aussi dans ce sélectionner une autre fonction somme exactement comme celle-ci, sauf cette somme est au total le WEEK_HRS_TOTAL pour l'année. Cela se traduit par un total cumulé de culture pour chaque entrée. Cependant, dans cette somme, je partitionne par le nom elm.Name, et sous nom de l'élément elm.SubName et retourne comme HRS_TOTAL_YEAR

    SOMME (GENERATED_FOR_YEAR (et.START_DATE, et.END_DATE, elm.element_id, MON ... SUN_)) OVER (PARTITION pAR elm.Name, elm.SubName) comme HRS_TOTAL_YEAR

le résultat de cela fonctionne comme prévu mais la question est le montant total sera affiché pour chaque enregistrement et le besoin pour afficher un total en cours.

Exemple:

ELM NAME ELM SUB_NAME  WEEK_HRS_TOTAL  HRS_TOTAL_YEAR 
DOOR   KNOB     12     37 
DOOR   KNOB     23     37 
DOOR   KNOB     2     37 
DOOR   PAINT     3     10 
DOOR   PAINT     4     10 
DOOR   PAINT     3     10 

j'aurais essayé d'utiliser

DENSE_RANK pour produire une colonne sur la base elm.SubName donnant

ELM NAME ELM SUB_NAME  WEEK_HRS_TOTAL RANK  HRS_TOTAL_YEAR 
DOOR   KNOB     12   1  37 
DOOR   KNOB     23   1  37 
DOOR   KNOB     2   1  37 
DOOR   PAINT     3   2  10 
DOOR   PAINT     4   2  10 
DOOR   PAINT     3   2  10 

Y at-il un moyen d'obtenir mon HRS_TOTAL_YEAR utiliser la colonne RANK plutôt que l'ELM SUB_NAME pour créer le total cumulé résultant de ce qui suit?

ELM NAME ELM SUB_NAME  WEEK_HRS_TOTAL RANK  HRS_TOTAL_YEAR 
DOOR   KNOB     12   1  12 
DOOR   KNOB     23   1  35 
DOOR   KNOB     2   1  37 
DOOR   PAINT     3   2  3 
DOOR   PAINT     4   2  7 
DOOR   PAINT     3   2  10 


Create or Replace "WEEK_HRS_TOTAL" (p_start_date et.start_date%type, 
            p_end_date et.end_date%type, 
            p_elm_id  elm.element_id, 
            p_sun_hrs et.sun_hrs 
            .....this continues for each day of the week) Return Number AS 
lv_dollar_gen_sum number; 
lv_start_date date; 
lv_end_date date; 
lv_rate elm.rate%type; 

begin 
    loop 
    exit when lv_start_date >= lv_end_date; 

    select r.rate into lv_rate 
    from hour_rate r 
    where r.element_id = p_element_id and 
     r.start_date <= lv_start_date and 
     r.end_date > lv_start_date; 

    lv_dollar_gen_sum := lv_dollar_gen_sum + (p_mon_hrs * lv_rate); 
    lv_start_date := lv_start_date + 1; 

Nous faisons cela pour chaque jour de la semaine, puis nous renvoyons le résultat. Les deux fonctions font la même chose, mais la partition pour l'appel de fonction WEEKS_HRS_TOTAL est basée sur element_id et et.start_date

Alors que la partition pour la HRS_TOTAL_YEAR est basée sur elm.Name, elm.SubName

+1

Si vous utilisez SUM() comme fonction analytique avec une clause PARTITION BY mais aucune clause ORDER BY, vous obtenez le comportement que vous avez remarqué. Ajoutez une clause ORDER BY et vous obtiendrez une somme cumulée. (Si vous commandez par une colonne ou une expression qui peut avoir des doublons, vous pouvez également avoir besoin d'une clause windowing, ou ajouter plus de critères à ORDER BY.) – mathguy

+0

Je vais mettre à jour le post avec le demandé. – Bman

+0

Est-il possible de déclarer dans l'ordre de la partition le résultat de: DENSE_RANK() OVER (ORDER BY elm.Name))? – Bman

Répondre

0

Vous venez d'ajouter un ORDER BY au SUM(). Cependant, vos données ne dispose pas d'une colonne évidente:

SUM(GENERATED_FOR_YEAR(et.START_DATE, et.END_DATE, elm.element_id, MON...SUN_)) OVER 
     (PARTITION BY elm.Name, elm.SubName 
     ORDER BY ?? 
     ) as HRS_TOTAL_YEAR 

Rien dans les données que vous avez montré a l'ordre que vous semblez vouloir.

+0

Ok, donc la date de début est basée sur une semaine, et j'ai sélectionné la table des semaines dans la sélection et j'ai utilisé ORDER_BY comme décrit et maintenant j'ai atteint un total cumulé. Merci à tous, mathGuy et Gordon! – Bman