powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка по неделе
20 сообщений из 20, страница 1 из 1
Выборка по неделе
    #39322397
Bugrimov_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Есть запрос.
Код: plsql
1.
select fio, to_char(dt_input, 'WW') || '-я ' AS "WEEK", ((dt_output-dt_input) * 24 - 1) AS "Часы" from inputs_outputs;



Выводит:
FIO WEEK Часы
Иванов И.А. 07-я 8
Иванов И.А. 07-я 8
Иванов И.А. 07-я 8
Иванов И.А. 08-я 8
Семенова А.О. 07-я 7.5
Иванов И.А. 08-я 7
Иванов И.А. 10-я 7.1
Семенова А.О. 07-я 8
Семенова А.О. 08-я 8


В исходной таблице есть ФИО сотрудника, дата и время прихода, дата и время ухода.
Пытаюсь подсчитать сколько часов отработал каждый сотрудник по неделям. Т.е. 7 неделю Иванов отработал столько-то часов и т.д.
Пытаюсь применить GROUP BY и не совсем получается.
Подскажите в каком направлении двигаться, какую конструкцию лучше использовать?
...
Рейтинг: 0 / 0
Выборка по неделе
    #39322402
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bugrimov_AПытаюсь применить GROUP BY и не совсем получается. Показывай
Не стесняйся
...
Рейтинг: 0 / 0
Выборка по неделе
    #39322404
Bugrimov_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например так.

Код: plsql
1.
select fio, to_char(dt_input, 'WW') || '-я ' AS "WEEK", ((dt_output-dt_input) * 24 - 1) AS "Часы" from inputs_outputs GROUP BY fio, to_char(dt_input, 'WW') || '-я ';



Вероятно я не до конца понимаю назначение группировки. (((
...
Рейтинг: 0 / 0
Выборка по неделе
    #39322411
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну часы-то, наверное, нужно просуммировать?
...
Рейтинг: 0 / 0
Выборка по неделе
    #39322418
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bugrimov_AВероятно я не до конца понимаю назначение группировки. (((RTFM Aggregate Functions (FAQ)
...
Рейтинг: 0 / 0
Выборка по неделе
    #39322422
Bugrimov_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно, получилось.
Код: plsql
1.
select fio, to_char(dt_input, 'WW') || '-я ' AS "WEEK", SUM((dt_output-dt_input) * 24 - 1) AS "Часы" from inputs_outputs GROUP BY fio, to_char(dt_input, 'WW') || '-я ';



Еще есть вопрос.
А как можно округлить?

Иванов И.А. 10-я 7.16666666666666666666666666666666666667
...
Рейтинг: 0 / 0
Выборка по неделе
    #39322429
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bugrimov_AА как можно округлить?RTFM Numeric Functions (FAQ)
...
Рейтинг: 0 / 0
Выборка по неделе
    #39322436
Bugrimov_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Еще вопрос.

у меня есть временной интервал рабочего дня например с 9 до 18:00.
Мне нужно подсчитать часы именно входящие во временной интервал. Получается мне нужно переписать содержимое SUM(....), т.е написать в ней подзапрос?
...
Рейтинг: 0 / 0
Выборка по неделе
    #39322454
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bugrimov_A, т.е написать в ней подзапрос?Совсем чайник? RTFM там же: наибольшее/наименьшее
...
Рейтинг: 0 / 0
Выборка по неделе
    #39322472
Bugrimov_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
) Да есть такое. Можете пример показать?
...
Рейтинг: 0 / 0
Выборка по неделе
    #39322564
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bugrimov_AМожете пример показать?
Код: plsql
1.
least((dt_output - trunc(dt_output))/24, 18) - …
...
Рейтинг: 0 / 0
Выборка по неделе
    #39323374
Bugrimov_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можете более подробный пример написать?
...
Рейтинг: 0 / 0
Выборка по неделе
    #39323375
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bugrimov_Aболее подробныйОт готовых примеров мозг тупеет.
...
Рейтинг: 0 / 0
Выборка по неделе
    #39323377
Bugrimov_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот мой запрос

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select fio, to_char(dt_input, 'WW') || '-я ' AS week_n,
  SUM(
      WHEN to_char(dt_input, 'HH24') BETWEEN 9 AND 18
              THEN 18 - to_char(dt_input, 'HH24')
          WHEN to_char(dt_output, 'HH24') BETWEEN 9 AND 18
              THEN to_char(dt_input, 'HH24') - 9

  ) AS clock_n
from inputs_outputs GROUP BY fio, to_char(dt_input, 'WW') || '-я ' ORDER BY fio, to_char(dt_input, 'WW') || '-я ' ASC
...
Рейтинг: 0 / 0
Выборка по неделе
    #39323378
Bugrimov_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного изменил

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select fio, to_char(dt_input, 'WW') || '-я ' AS week_n,
  SUM(CASE
      WHEN to_char(dt_input, 'HH24') BETWEEN 9 AND 18
              THEN 18 - to_char(dt_input, 'HH24')
          WHEN to_char(dt_output, 'HH24') BETWEEN 9 AND 18
              THEN to_char(dt_input, 'HH24') - 9
END 
  ) AS clock_n
from inputs_outputs GROUP BY fio, to_char(dt_input, 'WW') || '-я ' ORDER BY fio, to_char(dt_input, 'WW') || '-я ' ASC ;
...
Рейтинг: 0 / 0
Выборка по неделе
    #39323409
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bugrimov_AВот мой запрос
Код: plsql
1.
2.
3.
4.
5.
6.
CASE
      WHEN to_char(dt_input, 'HH24') BETWEEN 9 AND 18
              THEN 18 - to_char(dt_input, 'HH24')
          WHEN to_char(dt_output, 'HH24') BETWEEN 9 AND 18
              THEN to_char(dt_input, 'HH24') - 9
END

Ну и как, считает правильно?
...
Рейтинг: 0 / 0
Выборка по неделе
    #39323430
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bugrimov_A,
1) 2-3-я (вечерние/ночные) смены есть?
2) "сутку" и больше может работать?
3) внеурочные учитаваются?

.....
stax
...
Рейтинг: 0 / 0
Выборка по неделе
    #39323439
Bugrimov_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Считает не правильно.
1. Ночных смен нет
2. Рабочий день с понедельника по пятницу с 09:00 до 18:00. Перерыв 13:00 до 14:00.
3. Праздники считаются рабочими днями
...
Рейтинг: 0 / 0
Выборка по неделе
    #39323542
Bugrimov_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно модернизировать мой запрос?
...
Рейтинг: 0 / 0
Выборка по неделе
    #39323988
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bugrimov_AКак можно модернизировать мой запрос?
примерно так
я сильно не проверял, мож пропустил кокой-то интервал, тогда добавте в case

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
with t as (
select 'Stax' fio,to_date('01.01.2016 08:00','dd.mm.yyyy hh24:mi') dt_input,to_date('01.01.2016 20:00','dd.mm.yyyy hh24:mi') dt_output from dual union all
select 'Stax',to_date('02.01.2016 09:00','dd.mm.yyyy hh24:mi'),to_date('02.01.2016 16:00','dd.mm.yyyy hh24:mi') from dual union all
select 'Stax',to_date('01.02.2016 13:30','dd.mm.yyyy hh24:mi'),to_date('01.02.2016 21:00','dd.mm.yyyy hh24:mi') from dual union all
select 'Stax',to_date('02.02.2016 15:00','dd.mm.yyyy hh24:mi'),to_date('02.02.2016 16:00','dd.mm.yyyy hh24:mi') from dual union all
select 'Stax',to_date('03.02.2016 09:00','dd.mm.yyyy hh24:mi'),to_date('03.02.2016 13:40','dd.mm.yyyy hh24:mi') from dual union all
select 'Stax',to_date('04.02.2016 08:00','dd.mm.yyyy hh24:mi'),to_date('04.02.2016 08:20','dd.mm.yyyy hh24:mi') from dual union all
select 'Stax',to_date('05.02.2016 13:10','dd.mm.yyyy hh24:mi'),to_date('05.02.2016 13:40','dd.mm.yyyy hh24:mi') from dual union all
select 'Stax',to_date('06.02.2016 10:10','dd.mm.yyyy hh24:mi'),to_date('06.02.2016 11:00','dd.mm.yyyy hh24:mi') from dual union all
select 'Stax',to_date('06.02.2016 18:10','dd.mm.yyyy hh24:mi'),to_date('06.02.2016 21:00','dd.mm.yyyy hh24:mi') from dual union all
select 'Bugr',to_date('01.02.2016 08:30','dd.mm.yyyy hh24:mi'),to_date('01.02.2016 18:00','dd.mm.yyyy hh24:mi') from dual 
)
, tt as(
select 
  fio,dt_input,dt_output
 ,case
   when to_char(dt_input,'hh24miss')<'090000' then trunc(dt_input)+9/24                      --прийшов зарано
   when to_char(dt_input,'hh24miss') between'130000' and '140000' then trunc(dt_input)+13/24 --прийшов в обід
   when to_char(dt_input,'hh24miss') between'140000' and '180000' then dt_input-1/24         --прийшов після обіду
   when to_char(dt_input,'hh24miss') > '180000' then trunc(dt_input)+17/24                   --прийшов після роботи
   else dt_input
   end dt_i
 ,case
   when to_char(dt_output,'hh24miss')<'090000' then trunc(dt_output)+10/24                     --пішов зарано
   when to_char(dt_output,'hh24miss') between'130000' and '140000' then trunc(dt_output)+14/24 --пішов в обід
   when to_char(dt_output,'hh24miss') between'090000' and '130000' then dt_output+1/24         --пішов до обіду
   when to_char(dt_output,'hh24miss') > '180000' then trunc(dt_output)+18/24                   --пішов після роботи
   else dt_output
   end dt_o
 , 1 / (case when dt_input<dt_output and trunc(dt_input)=trunc(dt_output) then 1 else 0 end) err
 from t
)
select 
  fio,to_char(dt_input,'yyyy') yy,to_char(dt_input,'WW') ww 
--,tt.*
 ,sum(dt_o-dt_i-1/24) work
 ,max(err) eff
from tt
group by 
 fio,to_char(dt_input,'yyyy'),to_char(dt_input,'WW')
order by 1,2,3
SQL> /

FIO  YY   WW       WORK        EFF
---- ---- -- ---------- ----------
Bugr 2016 05     0.3333          1
Stax 2016 01     0.5833          1
Stax 2016 05     0.3750          1
Stax 2016 06     0.0347          1



......
stax
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка по неделе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]