2012-05-13 15 views
1

私は仕事中であり、時間ごとに特定の値をSUMする必要があります。PLSQLでフィールドを動的に(LOOP)選択するには?

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列、シフトの時間のためのものとのそれぞれにテーブルを返す必要があります:私はループのことができるようにし、PLSQLで以下の擬似コードをしたい、シフトが10時間であると言うことができます他の列は10時間シフトで1時間の売上を合計し、それぞれの時間はその時間の後に名前が付けられます。 基本的には、私の仕事は売り上げとは関係がないため、 "i"は1000ほど大きいので、私の問題に対する一般的な解決策を探しています。

また、私はPLSQLを使用しています。

ヘルプは非常に高く評価されます!

ありがとう

+0

誰か? (私はゴードンの答えの下にいくつかのコメントを書いた) – Gal

答えて

0

私は最終的に私の元の要求にあきらめ、使用時間をループに素晴らしく、簡単な方法を見つけました:


db.shift_start_time、 T1.n ASアワー、 SUM(db.salesを選択) DB、 FROM Hourly_Sales AS db.shift_start_time BETWEEN N> 0)T1 WHERE db.sale_time +(T1.n(ROWNUMを選択N DUAL CONNECT BY LEVEL < = 10から( からN個を選択) - 1)/24 AND db.shift_start_time +(T1.n)/ 24 db.shift_start_time BY 210 GROUP、
ORDER BY db.shift_start_time T1.n、 T1.n

はまた時間が四捨五入されていない私の問題を解決しました。 9時45分にシフトが開始されると、予想通りに動作し、9または10に丸められません。

私はこの解決策で問題が発生するのは、1時間ごとに別々の行があることです。まだ最高の解決策です。

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; 
+0

応答ありがとう、水曜日にそれを試してみる。 – Gal

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時間ごとに。

+0

私は水曜日にそれを試してみましょう、私のために働いた場合は更新されます。回答いただきありがとうございます。 – Gal

+0

アイデアは正しいです(そしてありがとう!)が、私が探していたものは正確ではありません。私はさらに説明しようとします: 1.私はSUMごとに別々の列が必要です。各シフトには正確に1行が必要です。 shift_start_time、sum1、sum2、sum3 ..... 2.必ずしも1時間にシフトが始まるとは限りません。すなわち、9:15から開始してから9:15-10:15 AS SUM1,10:15-11:15 AS SUM2などを合計する必要があります。 3。ちょっとばかげて、私のshift_start_timeはDATETIME型です。 "trunc(shift_start_time * 24)/ 24"のような行を正しく読み込めるように変換するにはどうすればよいですか? more ... – Gal

+0

4. "current_rowとの間の範囲は"正しい構文か疑似ですか? は何をしますか? 私はそれをより明確にしたいと思う。 ありがとうございます!私はそれを多く感謝します。 – Gal

関連する問題