Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос SQL / 25 сообщений из 34, страница 1 из 2
11.04.2018, 11:39
    #39628306
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос 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.
select x1.agr_no,
       x1.from_dat,
       p.tabn3,
       p.family3 Nume,
       p.name3 Prenume,
       o.name_podr23 name_podr23_actual,
       d.naim_dolj9 naim_dolj9_actual,
       (select (select pd.Name_Podr23
                  from podrs pd
                 where pd.code23 = pt.podr_code23)
          from paths pt
         where pt.person_tabn3 = p.tabn3
           and pt.dat_nazn16 =
               (select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < x.dat_nazn161)) Name_Podr_prec,
       (select (select dj.naim_dolj9
                  from Doljnosts dj
                 where dj.code9 = pt.doljnost_code9)
          from paths pt
         where pt.person_tabn3 = p.tabn3
           and pt.dat_nazn16 =
               (select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < x.dat_nazn161)) Dolj_prec,
       x.dat_nazn161
  from persons p,
       shtats s,
       podrs o,
       doljnosts d,
       (select max(t.dat_nazn16) as dat_nazn161, t.person_tabn3
          from paths t
         where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
               to_date('28.02.2018', 'dd.mm.yyyy')
           and t.actual = '0'
         group by t.person_tabn3) x,
       (select a1.from_dat, a1.tabn, a1.agr_no
          from bars2.PS_AGRE_PERSONS a1
         where a1.agr_type = 'TWO'
           and trunc(a1.from_dat) = (select max(trunc(a.from_dat)) from_dat
                                       from PS_AGRE_PERSONS a
                                      where a.agr_type = 'TWO'
                                        and a.tabn = a1.tabn
                                      group by a.tabn)) x1
where p.dat_uvolnen3 is null
   and p.tabn3 = s.person_tabn3
   and s.podr_code23 = o.code23
   and s.doljnost_code9 = d.code9
   and p.tabn3 = x.person_tabn3
   and p.tabn3 = x1.tabn



Но проблема в том что в один день один человек перевелся на 2 разные местоположения работы , но так я тут использую
Код: plsql
1.
max(t.dat_nazn16)

то естественно одна строка теряется , уже голову сломал как можно исправить . Буду признателен за любой хинт.
...
Рейтинг: 0 / 0
11.04.2018, 11:45
    #39628308
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
Цель : вывести всех информацию о рабочих за определенный месяц ( в данном случае февраль)

-Имя
-Фамилия
-Настоящее место работы
-Настоящяя должность
-Предыдущая место работы
-Предыдущая должность
-Дата изменений
...
Рейтинг: 0 / 0
11.04.2018, 11:51
    #39628311
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002,

Код: plsql
1.
ORA-00942: таблица или представление пользователя не существует
...
Рейтинг: 0 / 0
11.04.2018, 11:54
    #39628314
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
merch,

Зачем пытаетесь запустить его у себя ? Естественно он вам выдаст что у вас нет таблиц , но у меня они есть .
...
Рейтинг: 0 / 0
11.04.2018, 11:59
    #39628317
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002за любой хинт.rank/dense_rank = 1
...
Рейтинг: 0 / 0
11.04.2018, 12:14
    #39628324
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
Elic,

Есть такое , спасибо пошел читать .
...
Рейтинг: 0 / 0
11.04.2018, 12:15
    #39628326
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002Но проблема в том что в один день один человек перевелся на 2 разные местоположения работы , но так я тут использую
Код: plsql
1.
max(t.dat_nazn16)

то естественно одна строка теряется , уже голову сломал как можно исправить . Буду признателен за любой хинт.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
...
 select max(t.dat_nazn16) as dat_nazn161, t.person_tabn3
          from paths t
         where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
               to_date('28.02.2018', 'dd.mm.yyyy')
           and t.actual = '0'
         group by t.person_tabn3, "местоположение работы"
...
...
Рейтинг: 0 / 0
11.04.2018, 12:38
    #39628334
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
Dshedoouser2002Но проблема в том что в один день один человек перевелся на 2 разные местоположения работы , но так я тут использую
Код: plsql
1.
max(t.dat_nazn16)

то естественно одна строка теряется , уже голову сломал как можно исправить . Буду признателен за любой хинт.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
...
 select max(t.dat_nazn16) as dat_nazn161, t.person_tabn3
          from paths t
         where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
               to_date('28.02.2018', 'dd.mm.yyyy')
           and t.actual = '0'
         group by t.person_tabn3, "местоположение работы"
...


Немного не понимаю как это должно работать , вручную прописывать место работы ? ТОгда не вариант , там очень много строк .

RANK() неплохой способ но нужно еще как-то внедрить его тут .
...
Рейтинг: 0 / 0
11.04.2018, 12:50
    #39628343
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002RANK() неплохой способ но нужно еще как-то внедрить его тут .Потерпи какое-то время. Сейчас Stax придет, покажет тебе несколько примеров.
...
Рейтинг: 0 / 0
11.04.2018, 12:53
    #39628346
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
RANK() тоже не вариант , уж оченб большое количество строк которые запрос должен проверить . я вот думаю в сторону изменений в этом сегменте :

Код: plsql
1.
2.
3.
4.
select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < x.dat_nazn161)) Name_Podr_prec,
...
Рейтинг: 0 / 0
11.04.2018, 12:57
    #39628349
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002Немного не понимаюЛучше сначала понять, что для быстрого получения ответа надо проявить минимальное уважение к отвечающим.

Вместо публикации полотна, где используются 10 таблиц, свести число таблиц до минимума и показать на конкректных данных что есть и что хочется получить.
Хотя, если бы ты это сделал, наверное и вопрос отпал бы сам собой.

Мало у кого есть желание ковыряться в чужих портянках, но и такие извращенцы здесь водятся.
...
Рейтинг: 0 / 0
11.04.2018, 13:01
    #39628353
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
dbms_photoshop,

Я это все прекрасной понимаю , но в данном случае ( как мне кажется ) лучше предоставить весь запрос для его найлучшего понимания . Вопрос я думаю задан максимально коректно . А на счет уважение , тут вы неправы , уж извините . Я знаю что на это ресурсе сидят очень знающие в этой теме люди .
...
Рейтинг: 0 / 0
11.04.2018, 13:10
    #39628357
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002,

Коррелированный скаляр в коррелированном скаляре выглядит как плод больного воображения.
Чтобы понять психопата надо мыслить как психопат.
...
Рейтинг: 0 / 0
11.04.2018, 13:16
    #39628361
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
dbms_photoshop
Лучше сначала понять, что для быстрого получения ответа надо проявить минимальное уважение к отвечающим.

Вместо публикации полотна, где используются 10 таблиц, свести число таблиц до минимума и показать на конкректных данных что есть и что хочется получить.
Хотя, если бы ты это сделал, наверное и вопрос отпал бы сам собой.

Мало у кого есть желание ковыряться в чужих портянках, но и такие извращенцы здесь водятся.


мой "тонкий" юмор ТС не понял. Спасибо.
...
Рейтинг: 0 / 0
11.04.2018, 13:30
    #39628368
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002( как мне кажется )

Есть пословица.
...
Рейтинг: 0 / 0
11.04.2018, 13:31
    #39628370
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
Мне кажется мы немного отошли от моего вопроса , спасибо .
...
Рейтинг: 0 / 0
11.04.2018, 13:32
    #39628371
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002,

Код: plsql
1.
2.
3.
4.
5.
6.
with q(name, otdel, nazn) as (select 'Иванов', 'Продажники', to_date('01.04.2018','DD.MM.YYYY') from dual union all
select 'Петров', 'Продажники', to_date('02.04.2018','DD.MM.YYYY') from dual union all
select 'Иванов', 'Сварщики', to_date('03.04.2018','DD.MM.YYYY') from dual union all
select 'Иванов', 'Монтажники', to_date('03.04.2018','DD.MM.YYYY') from dual)

Select nazn, name from q where not exists (select * from q q1 where q1.nazn > q.nazn and q.name = q1.name)
...
Рейтинг: 0 / 0
11.04.2018, 13:36
    #39628372
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002,

Еще интересно что движет людьми, называющим таблицы persons и doljnosts.
Почему не persons and positions или ljudi и doljnost, если большая любовь к транслиту?

name и naim это все "имя"?
а family это фамилия, а не семья?

Предполагается, что нормальночу человеку понятны эти маразмы?
...
Рейтинг: 0 / 0
11.04.2018, 14:04
    #39628391
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
Dshedoo,

Я не имею информацию какие люди,должности там повторяются в один день .

dbms_photoshop,

Даже не хочу отвечать на этот вопрос .
...
Рейтинг: 0 / 0
11.04.2018, 14:25
    #39628408
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002RANK() неплохой способ но нужно еще как-то внедрить его тут .
перед внедрением надо еще и понять что хочем/надо получить

прикиньте, что человека перевели несколько раз за месяц, как тогда быть с Вашим max(t.dat_nazn16)?

даж решите Вы задачку по переходу работников (вывернитесь), так ж наверняка проблемка вылезет напр при расчете отпускных/больничных ...
опять же налоги, фонды и тд

зыы
рассмотрите возможность оформить второй перевод как работу по совместительству

зыы
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  1  with paths(person_tabn3, dat_nazn16,cex) as (
  2  select 100,date '2018-02-01',5 from dual union all
  3  select 100,date '2018-02-10',6 from dual union all
  4  select 100,date '2018-02-10',36 from dual union all
  5  select 200,date '2018-02-17',5 from dual )
  6  select person_tabn3,dat_nazn16 dat_nazn161,cex from (
  7   select person_tabn3,dat_nazn16,cex
  8    ,rank() over (partition by t.person_tabn3 order by t.dat_nazn16 desc) r
  9            from paths t
 10           where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
 11                 to_date('28.02.2018', 'dd.mm.yyyy')
 12  --           and t.actual = '0'
 13  --         group by t.person_tabn3, "местоположение работы"
 14* ) where r=1
SQL> /

PERSON_TABN3 DAT_NAZN        CEX
------------ -------- ----------
         100 10.02.18          6
         100 10.02.18         36
         200 17.02.18          5


.....
stax
...
Рейтинг: 0 / 0
11.04.2018, 15:18
    #39628462
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
Staxприкиньте, что человека перевели несколько раз за месяц, как тогда быть с Вашим max(t.dat_nazn16)?


Если одного человека будут переводить чаще чем один раз за день то проблем не будет .

Staxперед внедрением надо еще и понять что хочем/надо получить


Проблема в том что у меня запрос игнорирует одну или несколько строк .

Тут:
Код: plsql
1.
2.
3.
4.
5.
select max(t.dat_nazn16) as dat_nazn161, t.person_tabn3
          from paths t
         where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
               to_date('28.02.2018', 'dd.mm.yyyy')nd t.actual = '0' 
         group by t.person_tabn3) x,


Я заявляю что в
Код: plsql
1.
x.dat_nazn161

мы будем иметь значения от 01.02.2018-28.02.2018 .

Идем дальше ....

Тут:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select (select pd.Name_Podr23
                  from podrs pd
                 where pd.code23 = pt.podr_code23)
          from paths pt
         where pt.person_tabn3 = p.tabn3
           and pt.dat_nazn16 =
               (select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < x.dat_nazn161)) Name_Podr_prec



И вот тут :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select (select dj.naim_dolj9
                  from Doljnosts dj
                 where dj.code9 = pt.doljnost_code9)
          from paths pt
         where pt.person_tabn3 = p.tabn3
           and pt.dat_nazn16 =
               (select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < x.dat_nazn161)) Dolj_prec



Мы берем тот самый
Код: plsql
1.
max(pt1.dat_nazn16)

и сравниваем с нашим
Код: plsql
1.
 x.dat_nazn161



В конец я получаю необходимые данные но не все , то есть я должен получить 2 строки состоящий из одинаковых значении во всех столбцах , кроме вышеперечисленных Name_Podr_prec и Dolj_prec
...
Рейтинг: 0 / 0
11.04.2018, 15:19
    #39628465
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002Staxприкиньте, что человека перевели несколько раз за месяц, как тогда быть с Вашим max(t.dat_nazn16)?


Если одного человека будут переводить НЕ чаще чем один раз за день то проблем не будет .
...
Рейтинг: 0 / 0
11.04.2018, 15:37
    #39628493
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
Разобрался , Stax , вам отдельное спасибо , именно ваш способ помог .
...
Рейтинг: 0 / 0
11.04.2018, 15:56
    #39628519
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
user2002,

еще раз
1) работника (тн 100) за период between to_date('01.02.2018', 'dd.mm.yyyy') and to_date('28.02.2018', 'dd.mm.yyyy')
переводили два раза напр
05.02.2018 из цеха 5 в 9 и 15.02.2018 с 9 в 12, Вам надо последний перевод?

2) работника (тн 200) за период between to_date('01.02.2018', 'dd.mm.yyyy') and to_date('28.02.2018', 'dd.mm.yyyy')
переводили раз напр
06.02.2018 из цеха 5 в 9 и 20.02.2018 он устроился еще и в 12-й, Вам надо обе даты?

покажите как ето будет выглядить в paths

user2002
В конец я получаю необходимые данные но не все , то есть я должен получить 2 строки состоящий из одинаковых значении во всех столбцах , кроме вышеперечисленных Name_Podr_prec и Dolj_prec

если я правильно понял то

Код: plsql
1.
2.
3.
4.
5.
select max(t.dat_nazn16) as dat_nazn161, t.person_tabn3
          from paths t
         where t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and
               to_date('28.02.2018', 'dd.mm.yyyy')nd t.actual = '0' 
         group by t.person_tabn3) x,


должен вернуть не одну запись, и будет Вам счастье

.....
stax
...
Рейтинг: 0 / 0
11.04.2018, 16:10
    #39628541
user2002
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос SQL
Stax,

Еще раз ,

Мне нужно

3) Работника (тн100) за период between to_date('01.02.2018', 'dd.mm.yyyy') and to_date('28.02.2018', 'dd.mm.yyyy')
переводили два раза : из цеха А в цех Б, а потом обратно , в один день , мне нужны обе записи .


Не знаю насколько это правильно но я сделал так :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select (select dj.naim_dolj9
                  from Doljnosts dj
                 where dj.code9 = pt.doljnost_code9)
          from paths pt
         where pt.person_tabn3 = p.tabn3
           and pt.dat_nazn16 =
               (select max(pt1.dat_nazn16)
                  from paths pt1
                 where pt1.person_tabn3 = pt.person_tabn3
                   and pt1.dat_nazn16 < t.dat_nazn16)) Dolj_prec,


Внимание на последнюю строку.


Это подСелект , а в главном селекте добавил
Код: plsql
1.
t.dat_nazn16 between to_date('01.02.2018', 'dd.mm.yyyy') and to_date('28.02.2018', 'dd.mm.yyyy')
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос SQL / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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