Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка по неделе / 20 сообщений из 20, страница 1 из 1
07.10.2016, 07:55
    #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
07.10.2016, 08:05
    #39322402
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Bugrimov_AПытаюсь применить GROUP BY и не совсем получается. Показывай
Не стесняйся
...
Рейтинг: 0 / 0
07.10.2016, 08:11
    #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
07.10.2016, 08:22
    #39322411
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Ну часы-то, наверное, нужно просуммировать?
...
Рейтинг: 0 / 0
07.10.2016, 08:30
    #39322418
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Bugrimov_AВероятно я не до конца понимаю назначение группировки. (((RTFM Aggregate Functions (FAQ)
...
Рейтинг: 0 / 0
07.10.2016, 08:35
    #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
07.10.2016, 08:47
    #39322429
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Bugrimov_AА как можно округлить?RTFM Numeric Functions (FAQ)
...
Рейтинг: 0 / 0
07.10.2016, 08:57
    #39322436
Bugrimov_A
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Спасибо.
Еще вопрос.

у меня есть временной интервал рабочего дня например с 9 до 18:00.
Мне нужно подсчитать часы именно входящие во временной интервал. Получается мне нужно переписать содержимое SUM(....), т.е написать в ней подзапрос?
...
Рейтинг: 0 / 0
07.10.2016, 09:14
    #39322454
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Bugrimov_A, т.е написать в ней подзапрос?Совсем чайник? RTFM там же: наибольшее/наименьшее
...
Рейтинг: 0 / 0
07.10.2016, 09:35
    #39322472
Bugrimov_A
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
) Да есть такое. Можете пример показать?
...
Рейтинг: 0 / 0
07.10.2016, 11:15
    #39322564
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Bugrimov_AМожете пример показать?
Код: plsql
1.
least((dt_output - trunc(dt_output))/24, 18) - …
...
Рейтинг: 0 / 0
09.10.2016, 08:30
    #39323374
Bugrimov_A
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Можете более подробный пример написать?
...
Рейтинг: 0 / 0
09.10.2016, 08:39
    #39323375
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Bugrimov_Aболее подробныйОт готовых примеров мозг тупеет.
...
Рейтинг: 0 / 0
09.10.2016, 08:43
    #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
09.10.2016, 08:45
    #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
09.10.2016, 11:55
    #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
09.10.2016, 14:27
    #39323430
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Bugrimov_A,
1) 2-3-я (вечерние/ночные) смены есть?
2) "сутку" и больше может работать?
3) внеурочные учитаваются?

.....
stax
...
Рейтинг: 0 / 0
09.10.2016, 15:14
    #39323439
Bugrimov_A
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Считает не правильно.
1. Ночных смен нет
2. Рабочий день с понедельника по пятницу с 09:00 до 18:00. Перерыв 13:00 до 14:00.
3. Праздники считаются рабочими днями
...
Рейтинг: 0 / 0
10.10.2016, 05:24
    #39323542
Bugrimov_A
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по неделе
Как можно модернизировать мой запрос?
...
Рейтинг: 0 / 0
10.10.2016, 19:03
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка по неделе / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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