1

我在工作,需要按小时对特定值求和。假设一个班次是 10 个小时,我希望能够在 PLSQL 中循环并执行以下伪代码:

For (int i=0; i<10; i++) {
    SUM( DB.Sales) AS Hour#i
    FROM
         DB
    WHERE DB.sale_Time BETWEEN 
    DB.Shift_Start_Time + i AND
    DB.Shift_Start_Time + (i+1)
}

它应该返回一个包含 11 列的表,其中一列表示轮班时间,其他每一列汇总了 10 小时轮班中一小时的销售额,每一列都以其代表的小时命名。基本上我想将它用于其他目的,因为我的工作与销售无关,其中“i”可以大到 1000,所以我正在寻找一个通用的解决方案来解决我的问题。

同样,我正在使用 PLSQL。

帮助将不胜感激!

谢谢

4

3 回答 3

2

您可以使用 Oracle 中的分析函数来执行此操作。首先,我按小时汇总销售数据,因为这似乎是您想要的单位,然后使用带有窗口子句的分析函数总结小时数:

select db.shift_start_time,
       sum(db.sales) over (partition by null order by db.sale_time
                           range between current_row and <i> following)
from (select trunc(shift_start_time*24)/24 as thehour, sum(sales) as sales
      from DB
      group by trunc(shift_start_time*24)/24
     ) db

请注意,这假设每小时都有销售。

于 2012-05-13T14:08:05.233 回答
0

您可以使用光标来执行此操作,循环遍历每个元素。关键是按您感兴趣的时间分组。

BEGIN
    FOR x IN (
        SELECT TRUNC( DB.sale_Time, 'HH' ) AS start_time, 
               SUM( db.sales ) INTO mysum
          FROM db
         GROUP BY TRUNC( DB.sale_Time, 'HH' )
    ) LOOP

        /* Do loop stuff here */

    END LOOP;
END;
于 2012-05-13T13:48:30.607 回答
0

我最终放弃了我最初的要求,并找到了一种很好且简单的方法来循环使用:

SELECT
db.shift_start_time, T1.n AS Hour, SUM(db.sales) A​​S Hourly_Sales FROM db, (SELECT n FROM (SELECT rownum n FROM DUAL CONNECT BY LEVEL <=10) WHERE n > 0) T1 WHERE db.sale_time BETWEEN db.shift_start_time+(T1.n - 1)/24 AND db.shift_start_time + (T1.n)/24 GROUP BY db.shift_start_time, T1.n
ORDER BY db.shift_start_time, T1.n

它还解决了我的时间不四舍五入的问题。如果班次从 9:45 开始,它将按预期工作,而不是四舍五入到 9 或 10。

我对这个解决方案的唯一问题是每个小时都有一个单独的行。尽管如此,它仍然是最好的解决方案。

于 2012-05-16T07:33:21.487 回答