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 列のテーブルが返されます。1 列はシフトの時間用で、他の各列は 10 時間シフトの 1 時間の売上を合計します。それぞれの列は、それが表す時間にちなんで名付けられます。私の仕事は販売とは何の関係もないため、基本的には他の目的に使用したいと考えています。「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

これは、1 時間ごとに売上があることを前提としていることに注意してください。

于 2012-05-13T14:08:05.233 に答える
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 に答える
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 に答える