- 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
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
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
Je vais mettre à jour le post avec le demandé. – Bman
Est-il possible de déclarer dans l'ordre de la partition le résultat de: DENSE_RANK() OVER (ORDER BY elm.Name))? – Bman