Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Группировка по временным промежуткам  [new]
John7779
Member

Откуда:
Сообщений: 14
Здравствуйте!

Есть таблица приходов с датами и кол-вом коробок.

SELECT 10 qty, to_date('01.08.2010 22:53:49', 'dd.mm.yyyy hh24:mi:ss') FROM dual UNION ALL
SELECT 20 qty, to_date('1.08.2010 14:19:41', 'dd.mm.yyyy hh24:mi:ss') FROM dual UNION ALL
SELECT 15 qty, to_date('1.08.2010 10:53:41', 'dd.mm.yyyy hh24:mi:ss') FROM dual UNION ALL
SELECT 18 qty, to_date('1.08.2010 07:19:41', 'dd.mm.yyyy hh24:mi:ss') FROM dual UNION ALL
SELECT 15 qty, to_date('1.08.2010 06:19:41', 'dd.mm.yyyy hh24:mi:ss') FROM dual UNION ALL
SELECT 30 qty, to_date('1.08.2010 21:19:41', 'dd.mm.yyyy hh24:mi:ss') FROM dual

Есть промежутки времени - смены, с 8:00 до 20:00 и с 20:00 до 8:00

Подскажите пожалуйста как сгруппировать данные о кол-ве коробок по сменам?
16 дек 10, 12:42    [9948116]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
CASE
16 дек 10, 12:44    [9948132]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
count(case)
16 дек 10, 12:45    [9948152]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
по приколу
WITH t AS (
SELECT 10 qty, to_date('01.08.2010 22:53:49', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 20 qty, to_date('1.08.2010 14:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('1.08.2010 10:53:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 18 qty, to_date('1.08.2010 07:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('1.08.2010 06:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 30 qty, to_date('1.08.2010 21:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual
)
SELECT SUM(qty), DECODE(CASE WHEN d BETWEEN TIME '08:00:00' AND TIME '20:00:00' THEN 1 ELSE 0 END, 1, '8-20', '20-8') смена FROM (SELECT qty, CAST(CAST(d AS TIMESTAMP) AS TIME(9)) d FROM t)
GROUP BY CASE WHEN d BETWEEN TIME '08:00:00' AND TIME '20:00:00' THEN 1 ELSE 0 END
16 дек 10, 12:49    [9948177]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
без приколов
WITH t AS (
SELECT 10 qty, to_date('01.08.2010 22:53:49', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 20 qty, to_date('1.08.2010 14:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('1.08.2010 10:53:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 18 qty, to_date('1.08.2010 07:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('1.08.2010 06:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 30 qty, to_date('1.08.2010 21:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual
)
SELECT smena, SUM(qty) FROM (SELECT qty, CASE WHEN EXTRACT(HOUR FROM CAST(d AS TIMESTAMP)) BETWEEN 8 AND 19 THEN '8-20' ELSE '20-8' END smena FROM t)
GROUP BY smena
16 дек 10, 12:52    [9948198]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
John7779
Member

Откуда:
Сообщений: 14
bdsm_sql,

Спасибо большое! но я немного не точно написал. сгруппировать данные по сменам и дням,
те

1.08.2010 8-20 35
1.08.2010 20-8 70

2.08.2010 8-20 50
2.08.2010 20-8 55

3.08.2010 8-20 32
3.08.2010 20-8 21

...

и тд

не могу понять как сгруппировать например запись

1.08.2010 21:19:41
и
2.08.2010 06:19:41

в одну смену
16 дек 10, 13:06    [9948329]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
WITH t AS (
SELECT 10 qty, to_date('01.08.2010 22:53:49', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 20 qty, to_date('1.08.2010 14:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('1.08.2010 10:53:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 18 qty, to_date('3.08.2010 07:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('6.08.2010 06:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 30 qty, to_date('1.08.2010 21:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual
)
SELECT TRUNC(d), smena, SUM(qty) FROM (SELECT qty, d, CASE WHEN EXTRACT(HOUR FROM CAST(d AS TIMESTAMP)) BETWEEN 8 AND 19 THEN '8-20' ELSE '20-8' END smena FROM t)
GROUP BY TRUNC(d), smena
16 дек 10, 13:10    [9948380]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
на всякий пожарный, мало ли будут еще вопросы
WITH t AS (
SELECT 10 qty, to_date('01.08.2010 22:53:49', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 20 qty, to_date('1.08.2010 14:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('1.08.2010 10:53:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 18 qty, to_date('3.08.2010 07:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('6.08.2010 06:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 30 qty, to_date('1.08.2010 21:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual
),
dates AS (
SELECT d FROM dual
MODEL
DIMENSION BY (1 n)
MEASURES (CAST(NULL AS DATE) d)
RULES ITERATE (365) (
d[iteration_number + 1] = DATE '2010-01-01' + iteration_number
)
),
s AS (
SELECT '8-20' smena FROM dual UNION ALL
SELECT '20-8' smena FROM dual
)
SELECT TRUNC(dates.d), s.smena, NVL(SUM(qty), 0) FROM (SELECT qty, d, CASE WHEN EXTRACT(HOUR FROM CAST(d AS TIMESTAMP)) BETWEEN 8 AND 19 THEN '8-20' ELSE '20-8' END smena FROM t) t
PARTITION BY (smena) RIGHT JOIN dates ON dates.d = TRUNC(t.d)
RIGHT JOIN s ON s.smena = t.smena
GROUP BY TRUNC(dates.d), s.smena
ORDER BY 1, 2
16 дек 10, 13:37    [9948615]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
lLocust
Member

Откуда:
Сообщений: 338
bdsm_sql
WITH t AS (
SELECT 10 qty, to_date('01.08.2010 22:53:49', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 20 qty, to_date('1.08.2010 14:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('1.08.2010 10:53:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 18 qty, to_date('3.08.2010 07:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('6.08.2010 06:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 30 qty, to_date('1.08.2010 21:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual
)
SELECT TRUNC(d), smena, SUM(qty) FROM (SELECT qty, d, CASE WHEN EXTRACT(HOUR FROM CAST(d AS TIMESTAMP)) BETWEEN 8 AND 19 THEN '8-20' ELSE '20-8' END smena FROM t)
GROUP BY TRUNC(d), smena


зачем подзапрос?

SELECT TRUNC(d), 
       CASE WHEN EXTRACT(HOUR FROM CAST(TRUNC(d) AS TIMESTAMP)) BETWEEN 8 AND 19 THEN '8-20' ELSE '20-8' END smena, 
       SUM(qty) 
from t
GROUP BY TRUNC(d), 2
16 дек 10, 13:47    [9948683]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
lLocust
Member

Откуда:
Сообщений: 338
lLocust,

не, туплю, нужен.... Извиняюсь
16 дек 10, 13:47    [9948689]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
lLocust
зачем подзапрос?

SELECT TRUNC(d), 
       CASE WHEN EXTRACT(HOUR FROM CAST(TRUNC(d) AS TIMESTAMP)) BETWEEN 8 AND 19 THEN '8-20' ELSE '20-8' END smena, 
       SUM(qty) 
from t
GROUP BY TRUNC(d), 2

дело вкуса.. планы идентичны
16 дек 10, 13:48    [9948693]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
ага и я протупил, лишь на план глянул..
у тебя вообще не то :)
16 дек 10, 13:50    [9948711]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
Elic
Member

Откуда:
Сообщений: 29991
bdsm_sql
на всякий пожарный, мало ли будут еще вопросы
Ты пыжишься несколько не в ту сторону.
Сперва тебе следует понять, что 2 часа и 22 часа одного и того же дня - это разные смены.
16 дек 10, 13:56    [9948749]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
Elic
bdsm_sql
на всякий пожарный, мало ли будут еще вопросы
Ты пыжишься несколько не в ту сторону.
Сперва тебе следует понять, что 2 часа и 22 часа одного и того же дня - это разные смены.

внатуре..
ок, вот запрос: могу опять конечно ошибиться но идея понятна
WITH t AS (
SELECT 10 qty, to_date('01.08.2010 22:53:49', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 20 qty, to_date('1.08.2010 14:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('1.08.2010 10:53:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 18 qty, to_date('3.08.2010 07:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('6.08.2010 06:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 30 qty, to_date('1.08.2010 21:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual
)
SELECT TRUNC(d), smena, SUM(qty) FROM (SELECT qty, d, CASE WHEN EXTRACT(HOUR FROM CAST(d - 8 AS TIMESTAMP)) BETWEEN 0 AND 11 THEN '8-20' ELSE '20-8' END smena FROM t)
GROUP BY TRUNC(d), smena
16 дек 10, 14:00    [9948786]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
Elic
Member

Откуда:
Сообщений: 29991
bdsm_sql
внатуре..
ок, вот запрос: могу опять конечно ошибиться
Отнимаешь не там.
16 дек 10, 14:05    [9948814]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
короче)) 8 дней отнял вместо 8 часов и группировал не по тому..
думаю что так верно.
хотя сегодня явно не мой день
WITH t AS (
SELECT 10 qty, to_date('1.08.2010 22:53:49', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 15 qty, to_date('2.08.2010 06:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 0 qty, to_date('3.08.2010 14:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 0 qty, to_date('3.08.2010 10:53:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 0 qty, to_date('3.08.2010 07:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 0 qty, to_date('4.08.2010 21:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual
)
SELECT CASE WHEN smena = '20-8' THEN (TO_CHAR(TRUNC(d - 8 / 24), 'DD.MM.YY')) || '-' || TO_CHAR(TRUNC(d - 8 / 24) + 1, 'DD.MM.YY') ELSE TO_CHAR(TRUNC(d - 8 / 24), 'DD.MM.YY') END || ' ' || smena, SUM(qty) FROM (SELECT qty, d, CASE WHEN EXTRACT(HOUR FROM CAST(d - 8 / 24 AS TIMESTAMP)) BETWEEN 0 AND 11 THEN '8-20' ELSE '20-8' END smena FROM t)
GROUP BY TRUNC(d - 8 / 24), smena
16 дек 10, 14:05    [9948819]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
Elic
bdsm_sql
внатуре..
ок, вот запрос: могу опять конечно ошибиться
Отнимаешь не там.

отнимал-то там но не столько и надо было не только там
16 дек 10, 14:06    [9948826]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
с такими данными будет по-наглядней
WITH t AS (
SELECT 1 qty, to_date('1.08.2010 22:53:49', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 10 qty, to_date('2.08.2010 06:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 100 qty, to_date('3.08.2010 14:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 1000 qty, to_date('3.08.2010 10:53:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 10000 qty, to_date('3.08.2010 07:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual UNION ALL
SELECT 100000 qty, to_date('4.08.2010 21:19:41', 'dd.mm.yyyy hh24:mi:ss') d FROM dual
)
SELECT CASE WHEN smena = '20-8' THEN (TO_CHAR(TRUNC(d - 8 / 24), 'DD.MM.YY')) || '-' || TO_CHAR(TRUNC(d - 8 / 24) + 1, 'DD.MM.YY') ELSE TO_CHAR(TRUNC(d - 8 / 24), 'DD.MM.YY') END || ' ' || smena, SUM(qty) FROM (SELECT qty, d, CASE WHEN EXTRACT(HOUR FROM CAST(d - 8 / 24 AS TIMESTAMP)) BETWEEN 0 AND 11 THEN '8-20' ELSE '20-8' END smena FROM t)
GROUP BY TRUNC(d - 8 / 24), smena
16 дек 10, 14:08    [9948841]     Ответить | Цитировать Сообщить модератору
 Re: Группировка по временным промежуткам  [new]
John7779
Member

Откуда:
Сообщений: 14
Ребята спасибо большое!!! )
16 дек 10, 14:31    [9949049]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить