2012-05-13 2 views
1

Я нахожусь на работе и нуждаюсь в особом значении SUM по часам. Допустим, сдвиг в 10 часов, я хочу, чтобы иметь возможность цикла и сделать следующий псевдокод в PLSQL:Как динамически выбирать поля (LOOP) в 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.

Справка будет очень признательна!

Спасибо

+0

Кто-нибудь? (Я написал несколько комментариев под ответом Гордона) – Gal

ответ

0

я в конце концов отказался от своих первоначальных требований и нашел хороший и простой способ проходных часов с помощью:

ВЫБРАТЬ
db.shift_start_time, T1.n AS Hour, SUM (db.sales) КАК Hourly_Sales ОТ дб, (SELECT п ОТ (SELECT ROWNUM п ОТ DUAL CONNECT BY УРОВЕНЬ < = 10) где п> 0) Т1 ГДЕ db.sale_time МЕЖДУ db.shift_start_time + (T1.n - 1)/24 И 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.

Только проблема у меня с этим решением заключается в том, что для каждого часа есть отдельная строка. Тем не менее, это все еще лучшее решение.

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 

Заметим, что это предполагает, что есть продажи на каждый час.

+0

Я попробую в среду, обновится, если это сработает для меня. Спасибо за ответ. – Gal

+0

Идея правильная (и спасибо за это!), Но не совсем то, что я искал. Я попытаюсь объяснить далее: 1. Мне нужен отдельный столбец для каждого СУММЫ. Каждая смена должна иметь ровно 1 строку. shift_start_time, sum1, sum2, sum3 ..... 2. Сдвиг не обязательно начинается в круглый час. то есть он может начинаться в 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», могли прочитать его правильно? еще ... – Gal

+0

4. Является ли «диапазон между current_row и следующим« правильным синтаксисом или псевдо? какой сделать? Надеюсь, я прояснил ситуацию. спасибо! Я очень это ценю. – Gal

Смежные вопросы