Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORACLE PL/SQL,ЗАПРОС / 12 сообщений из 12, страница 1 из 1
12.12.2018, 12:54
    #39746606
sanzhar333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
В таблице U_TS, в столбце OPER_CODE поле "Прием", может повторяться нужно брать первый "Прием"(наверное нужно его отобрать по min(id).
С таблицы U_TS надо сделать выборку чтобы получить результат как в таблице R_TS.

Сначала идет группировка по дням ПЕРВОГО ПРИЕМА ПОСЫЛКИ.

Пример1.Допустим 10.12.2018 было принято 2 POSYLKI(a1,b2)

day0. день_приема. была вручена 1 POSYLKA из 2х. day0=(1*100)/2 = 50%
day1. день_приема+1день. была вручена 1 POSYLKA из 2х. day1=(1*100)/2 = 50%
day2.день_приема+2дней. не было вручений.
если все посылки за 10.12.2018 уже вручены далее ставим просто 100%(day3 = 100%,day4 = 100%... и.т.д)

Пример2.Допустим 12.12.2018 было принято 3 POSYLKI(c3,d4,e5)
day0. день_приема. была вручено 0 POSYLKA из 3х. day0=(0*100)/3 = 0%
day1. день_приема+1день. была вручена 1 POSYLKA из 3х. day1=(1*100)/3 = 33%
day2.день_приема+2дней. было вручено 2 POSYLKA их 3х. day2=(2*100)/3 = 67%
если все посылки за 12.12.2018 уже вручены далее ставим просто 100%(day3 = 100%,day4 = 100%... и.т.д)


Пример3.Допустим 16.12.2018 было принята 1 POSYLKI(f6)
day0. день_приема. была вручено 0 POSYLKA из 1х. day0=(0*100)/1 = 0%
day1. день_приема+1день. была вручена 1 POSYLKA из 1х. day1=(0*100)/1 = 0%
day2.день_приема+2дней. было вручено 2 POSYLKA их 1х. day2=(0*100)/1 = 0%
day3.день_приема+3дня.было вручено 1 POSYLKA их 1х. day3=(1*100)/1 = 100%
то есть если все посылки за 16.12.2018 уже вручены ставим просто 100%(day4 = 100%... и.т.д)
...
Рейтинг: 0 / 0
12.12.2018, 12:58
    #39746613
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
Студентам, желающим помощи

http://www.bugtraq.ru/forum/faq/general/smart-questions.html] Как правильно задавать вопросы

Мессир
1) Внятная постановка задачи, отчет в чем? инструмент то какой?
2) что хочешь получить
3) как пытался решить задачу
4) тестовые данные, в таком виде:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
with mytable(id,fio) as (
select 1,'Ремарк, Эрих, Мария' from dual union all
select 2,'Фернандес, Перес, Владимир, Кастулович' from dual union all
select 3,'Хосуэ, Гонсалес, де Леон' from dual union all
select 4,'Карам, Абу, Иль, Хатаб' from dual
)
select id,fio from tytable;




p.s. Используй ТЭГ SRC для оформления
...
Рейтинг: 0 / 0
12.12.2018, 12:59
    #39746614
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
Здесь помогут.
...
Рейтинг: 0 / 0
12.12.2018, 13:06
    #39746620
sanzhar333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
Vadim Lejnin,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select 1 as id,to_date('10.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'a1' as nomer_posylki,'Прием' as oper_code from dual union all
select 2 as id,to_date('10.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'a1' as nomer_posylki,'Сортировка' as oper_code from dual union all
select 3 as id,to_date('10.12.2018 03:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'a1' as nomer_posylki,'Прием' as oper_code from dual union all
select 4 as id,to_date('10.12.2018 04:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'a1' as nomer_posylki,'Вручено' as oper_code from dual union all
select 5 as id,to_date('10.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'b2' as nomer_posylki,'Прием' as oper_code from dual union all
select 6 as id,to_date('11.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'b2' as nomer_posylki,'Вручено' as oper_code from dual union all
select 7 as id,to_date('12.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'c3' as nomer_posylki,'Прием' as oper_code from dual union all
select 8 as id,to_date('13.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'c3' as nomer_posylki,'Вручено' as oper_code from dual union all
select 9 as id,to_date('12.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'d4' as nomer_posylki,'Прием' as oper_code from dual union all
select 10 as id,to_date('14.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'d4' as nomer_posylki,'Вручено' as oper_code from dual union all
select 11 as id,to_date('12.12.2018 07:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'e5' as nomer_posylki,'Прием' as oper_code from dual union all
select 12 as id,to_date('12.12.2018 09:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'e5' as nomer_posylki,'Сортировка' as oper_code from dual union all
select 11 as id,to_date('12.12.2018 10:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'e5' as nomer_posylki,'Прием' as oper_code from dual union all
select 13 as id,to_date('14.12.2018 11:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'e5' as nomer_posylki,'Вручено' as oper_code from dual union all
select 14 as id,to_date('16.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'f6' as nomer_posylki,'Прием' as oper_code from dual union all
select 15 as id,to_date('19.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'f6' as nomer_posylki,'Вручено' as oper_code from dual 




Код: plsql
1.
2.
3.
select '10.12.18' as date_reg,2 as posylki,'50%' as day0,'50%' as day1,'100%' as day2,'100%' as day3,'100%' as day4,'100%' as day5 from dual union all
select '12.12.18' as date_reg,3 as posylki,'0%' as day0,'33%' as day1,'67%' as day2,'100%' as day3,'100%' as day4,'100%' as day5 from dual union all
select '16.12.18' as date_reg,1 as posylki,'0%' as day0,'0%' as day1,'0%' as day2,'100%' as day3,'100%' as day4,'100%' as day5 from dual
...
Рейтинг: 0 / 0
12.12.2018, 21:13
    #39746953
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
Код: 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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
with u_ts(id,dt,nn,oc) as (
select 1  ,to_date('10.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') ,'a1'  ,'Прием'  from dual union all
select 2  ,to_date('10.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') ,'a1'  ,'Сортировка'  from dual union all
select 3  ,to_date('10.12.2018 03:00:00','dd.mm.yyyy hh24:mi:ss') ,'a1'  ,'Прием'  from dual union all
select 4  ,to_date('10.12.2018 04:00:00','dd.mm.yyyy hh24:mi:ss') ,'a1'  ,'Вручено'  from dual union all
select 5  ,to_date('10.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') ,'b2'  ,'Прием'  from dual union all
select 6  ,to_date('11.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') ,'b2'  ,'Вручено'  from dual union all
select 7  ,to_date('12.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') ,'c3'  ,'Прием'  from dual union all
select 8  ,to_date('13.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') ,'c3'  ,'Вручено'  from dual union all
select 9  ,to_date('12.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') ,'d4'  ,'Прием'  from dual union all
select 10  ,to_date('14.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') ,'d4'  ,'Вручено'  from dual union all
select 11  ,to_date('12.12.2018 07:00:00','dd.mm.yyyy hh24:mi:ss') ,'e5'  ,'Прием'  from dual union all
select 12  ,to_date('12.12.2018 09:00:00','dd.mm.yyyy hh24:mi:ss') ,'e5'  ,'Сортировка'  from dual union all
select 11  ,to_date('12.12.2018 10:00:00','dd.mm.yyyy hh24:mi:ss') ,'e5'  ,'Прием'  from dual union all
select 13  ,to_date('14.12.2018 11:00:00','dd.mm.yyyy hh24:mi:ss') ,'e5'  ,'Вручено'  from dual union all
select 14  ,to_date('16.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') ,'f6'  ,'Прием'  from dual union all
select 15  ,to_date('19.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') ,'f6'  ,'Вручено'  from dual 
)
, r_ts as (
select '10.12.18' ,2 as posylki,'50%' as day0,'50%' as day1,'100%' as day2,'100%' as day3,'100%' as day4,'100%' as day5 from dual union all
select '12.12.18' ,3 as posylki,'0%' as day0,'33%' as day1,'67%' as day2,'100%' as day3,'100%' as day4,'100%' as day5 from dual union all
select '16.12.18' ,1 as posylki,'0%' as day0,'0%' as day1,'0%' as day2,'100%' as day3,'100%' as day4,'100%' as day5 from dual
)
, t as (
select
    t1.nn
    ,min(trunc(t1.dt,'DD')) as dt1
    ,max(trunc(t2.dt,'DD')) as dt2   
from u_ts t1,u_ts t2
where t1.nn = t2.nn
and t1.oc='Прием'
and t2.oc='Вручено'
group by t1.nn
)
, tt as (select 
    dt1
    ,dt2
    ,dt2-dt1 as dd
    , count(dt1) over (PARTITION BY DT1) as cnt from t
)
--select * from tt order by dt1
select 
dt1
,cnt
,cnt  - sum(sign(dd )) as day1
,cnt  - sum(sign(dd - 1)) as day2
,cnt  - sum(sign(dd - 2)) as day3 
,cnt  - sum(sign(dd - 3)) as day4 
,cnt  - sum(sign(dd - 4)) as day5 
from tt 
group by dt1,cnt
order by dt1
;

DT1              CNT       DAY1       DAY2       DAY3       DAY4       DAY5
--------- ---------- ---------- ---------- ---------- ---------- ----------
10-DEC-18          2          1          3          4          4          4
12-DEC-18          3          0          1          4          6          6
16-DEC-18          1          0          0          0          1          2



Как то так, но дальше бошка не работает (болею), что там с чем надо сложить
Идея понятна, если написать через case точно взлетит
...
Рейтинг: 0 / 0
13.12.2018, 08:47
    #39747089
sanzhar333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
Vadim Lejnin,

Vadim Lejnin,

спасибо вам большое за отклик, поле DT1 и CNT вы сделали правильно.
но поля DAY1,DAY2,DAY3,DAY4,DAY5 считаются таким образом:

пример1
DT1='10.12.2018'
CNT=2
day1=полеCNT-(суммаВрученных посылок в тотже день(10.12.2018))
day2=полеCNT-(суммаВрученных посылок день + 1(11.12.2018))
day3=полеCNT-(суммаВрученных посылок день + 2(12.12.2018))
после того как все посылки вручены за 10.12.2018 он берет просто поле CNT
day4=полеCNT
day5=полеCNT

пример2
DT1='12.12.2018'
CNT=3
day1=полеCNT-(суммаВрученных посылок в тотже день(12.12.2018))
day2=полеCNT-(суммаВрученных посылок день + 1(13.12.2018))
day3=полеCNT-(суммаВрученных посылок день + 2(14.12.2018))
после того как все посылки вручены за 15.12.2018 он берет просто поле CNT
day4=полеCNT
day5=полеCNT
...
Рейтинг: 0 / 0
13.12.2018, 08:49
    #39747091
sanzhar333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
sanzhar333,
ТО ЕСТЬ ВОТ ТАКИМ ОБРАЗОМ)))
пример1
DT1='10.12.2018'
CNT=2
day1=суммаВрученных посылок в тотже день(10.12.2018)
day2=суммаВрученных посылок день + 1(11.12.2018)
day3=суммаВрученных посылок день + 2(12.12.2018)
после того как все посылки вручены за 10.12.2018 он берет просто поле CNT
day4=полеCNT
day5=полеCNT

пример2
DT1='12.12.2018'
CNT=3
day1=суммаВрученных посылок в тотже день(12.12.2018)
day2=суммаВрученных посылок день + 1(13.12.2018)
day3=суммаВрученных посылок день + 2(14.12.2018)
после того как все посылки вручены за 15.12.2018 он берет просто поле CNT
day4=полеCNT
day5=полеCNT
...
Рейтинг: 0 / 0
13.12.2018, 08:56
    #39747092
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
sanzhar333вы сделали правильно.
но поля DAY1,DAY2,DAY3,DAY4,DAY5 считаются таким образом:Скажи, куда ему прийти за твоей зарплатой?
...
Рейтинг: 0 / 0
13.12.2018, 09:04
    #39747099
sanzhar333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
Elic,
я только учусь)
...
Рейтинг: 0 / 0
13.12.2018, 09:40
    #39747127
sanzhar333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select 1 as id,to_date('10.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'a1' as nomer_posylki,'Прием' as oper_code from dual union all
select 2 as id,to_date('10.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'a1' as nomer_posylki,'Сортировка' as oper_code from dual union all
select 3 as id,to_date('10.12.2018 03:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'a1' as nomer_posylki,'Прием' as oper_code from dual union all
select 4 as id,to_date('10.12.2018 04:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'a1' as nomer_posylki,'Вручено' as oper_code from dual union all
select 5 as id,to_date('10.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'b2' as nomer_posylki,'Прием' as oper_code from dual union all
select 6 as id,to_date('11.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'b2' as nomer_posylki,'Вручено' as oper_code from dual union all
select 7 as id,to_date('12.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'c3' as nomer_posylki,'Прием' as oper_code from dual union all
select 8 as id,to_date('13.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'c3' as nomer_posylki,'Вручено' as oper_code from dual union all
select 9 as id,to_date('12.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'d4' as nomer_posylki,'Прием' as oper_code from dual union all
select 10 as id,to_date('14.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'d4' as nomer_posylki,'Вручено' as oper_code from dual union all
select 11 as id,to_date('12.12.2018 07:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'e5' as nomer_posylki,'Прием' as oper_code from dual union all
select 12 as id,to_date('12.12.2018 09:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'e5' as nomer_posylki,'Сортировка' as oper_code from dual union all
select 13 as id,to_date('12.12.2018 10:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'e5' as nomer_posylki,'Прием' as oper_code from dual union all
select 14 as id,to_date('14.12.2018 11:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'e5' as nomer_posylki,'Вручено' as oper_code from dual union all
select 15 as id,to_date('16.12.2018 01:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'f6' as nomer_posylki,'Прием' as oper_code from dual union all
select 16 as id,to_date('19.12.2018 02:00:00','dd.mm.yyyy hh24:mi:ss') as date_reg,'f6' as nomer_posylki,'Вручено' as oper_code from dual 



Вот таблица
...
Рейтинг: 0 / 0
13.12.2018, 15:14
    #39747455
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select dt_income, count(nomer_posylki) total_income
     , count(case when days_offset = 0 then nomer_posylki end) d0
     , case when max(days_offset) < 1 then count(nomer_posylki) else count(case when days_offset = 1 then nomer_posylki end) end d1
     , case when max(days_offset) < 2 then count(nomer_posylki) else count(case when days_offset = 2 then nomer_posylki end) end d2
     , case when max(days_offset) < 3 then count(nomer_posylki) else count(case when days_offset = 3 then nomer_posylki end) end d3
     , case when max(days_offset) < 4 then count(nomer_posylki) else count(case when days_offset = 4 then nomer_posylki end) end d4
     , case when max(days_offset) < 5 then count(nomer_posylki) else count(case when days_offset = 5 then nomer_posylki end) end d5
  from (
          select nomer_posylki
               , min(case oper_code when 'Прием' then trunc(date_reg) end) dt_income
               , max(case oper_code when 'Вручено' then trunc(date_reg) end) 
               - min(case oper_code when 'Прием' then trunc(date_reg) end) days_offset
           from U_TS
          group by nomer_posylki
) group by dt_income
order by dt_income

...
Рейтинг: 0 / 0
14.12.2018, 05:14
    #39747686
sanzhar333
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ORACLE PL/SQL,ЗАПРОС
andrey_anonymous,Спасибо вам большое
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORACLE PL/SQL,ЗАПРОС / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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