2017-06-12 24 views
1
  1. 我有一个表格,它包含每日小时星期一,我有一个计算并返回每周总数的函数。我总结了这些基于当前周和分区由element_id和start_date调用结果WEEK_HRS_TOTAL。

这会导致每周的总数。DENSE_RANK()的结果可以在当前select语句的SUM中使用

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 
  • 我也有在该选择酷似上面的一个除了该和与总年度的WEEK_HRS_TOTAL另一个求和函数。从而导致每个参赛项目的总跑步总数。然而,在这个和我在elm.Name和子元素名称elm.SubName分区和恢复作为HRS_TOTAL_YEAR

    SUM(GENERATED_FOR_YEAR(et.START_DATE,et.END_DATE,elm.element_id,MON ... SUN_)) OVER(PARTITION BY elm.Name,elm.SubName)作为HRS_TOTAL_YEAR

  • 这样做的结果,但如预期的问题是总将显示每个记录,需要它来显示运行总计工作。

    例子:

    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 
    

    我会尝试使用

    DENSE_RANK生产基础上,elm.SubName给

    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 
    

    列有没有办法让我的HRS_TOTAL_YEAR要使用RANK列而不是ELM SUB_NAME创建运行总数,导致以下情况?

    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; 
    

    我们在一周的每一天都这样做,然后返回结果。这两个函数做同样的事情,但是对于WEEKS_HRS_TOTAL函数调用分区是基于element_id和et.start_date

    虽然对于HRS_TOTAL_YEAR分区是基于elm.Name,elm.SubName

    +1

    如果使用SUM()作为具有PARTITION BY子句但没有ORDER BY子句的分析函数,则会得到您注意到的行为。添加一个ORDER BY子句,你将得到一个运行总和。 (如果您通过可能有重复项的列或表达式进行排序,则可能还需要一个窗口子句,或向ORDER BY添加更多条件。) – mathguy

    +0

    我将根据请求更新帖子。 – Bman

    +0

    是否可以通过分区的顺序声明以下结果:DENSE_RANK()OVER(ORDER BY elm.Name))? – Bman

    回答

    0

    你只需要添加ORDER BYSUM()。但是,您的数据没有明显的列:

    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 
    

    您显示的数据中没有任何内容具有您似乎需要的排序。

    +0

    好吧,所以开始日期是以一周为基础的,我选择了星期表作为选择,并按照所述使用了ORDER_BY,现在我已经达到了运行总数。感谢一群mathGuy和Gordon! – Bman

    相关问题