Конференция "Базы" » Запрос списка уволенных [D7, FireBird]
 
  • worldmen (02.04.11 20:09) [0]
    есть Таблица трудовой
    ID - (ключ FK )
    Date_IN - (дата приема на работу)
    Date_out - (дата увольнения)

    В таблице хранятся данные всей трудовой, поэтому на каждого человека приходится несколько записей даты приема и даты увольнения.
    Если человек еще работает, то одна из записей Date_out для него равна Null, а если его уволили то все даты Date_out заполнены.
    Вопрос: как нужно выбрать список только уволенных?

    пробовал по максимальной дате Date_out, но сюда попадают и еще работающие.
  • Anatoly Podgoretsky © (02.04.11 20:26) [1]
    Это как "еще работающие", и при этом Date_out <> NULL
    Смешно
  • sniknik © (02.04.11 20:39) [2]
    > Это как "еще работающие", и при этом Date_out <> NULL
    старая запись c Date_out <> NULL, новая = NULL.
    условие по только одной записи "кривое".

    выбирать нужно по максимальной Date_IN с проверкой на <> NULL у Date_out.
  • !!! (02.04.11 20:54) [3]

    Select B.ID
    From
    (Select ID, Count(ID) CountNull
    From People
    Where Date_Out is not null
    Group By ID) A,
    (Select ID, Count(ID) CountNotNull
    From People
    Group ID) B
    Where B.ID = A.ID And B.CountNotNull = A.CountNull

  • worldmen (02.04.11 21:28) [4]
    Интересное решение, но работает !!!!
  • sniknik © (02.04.11 22:29) [5]
    тогда уж попроще
    Select DISTINCT ID From People
    WHERE ID NOT IN (Select ID From People Where Date_Out is null)

  • clickmaker © (03.04.11 00:30) [6]
    а не проще признак ввести "уволен"?
  • worldmen (03.04.11 00:37) [7]
    > а не проще признак ввести "уволен"?
    Можно, но дата увольнения всеравно нужна.
  • Anatoly Podgoretsky © (03.04.11 00:48) [8]
    > clickmaker  (03.04.2011 00:30:06)  [6]

    Излишество, дублирует дату уволнения.
  • sniknik © (03.04.11 01:03) [9]
    > но дата увольнения всеравно нужна.
    какой в ней смысл? сделать признак (операция) с одной датой. идентификатор работника само собой оставить + добавить искусственный ключ операции, автоикремент (полезно для разных "адресных"/позаписьных ссылок в запросах)

    признак может быть не только "уволен", а еще и принят/переведен/повышен/т.д. ("на вырост").
  • Кщд (04.04.11 07:10) [10]
    >!!!   (02.04.11 20:54) [3]
    "иногда лучше жевать" (с) :)

    см. sniknik ©   (02.04.11 22:29) [5]
    или

    select j.id
    from employee j
    where not exists (
                          select null
                          from record p2
                          where p2.id = j.id
                                   and p2.date_out is null
                          )

    , где employee - таблица работников
  • !!! (04.04.11 10:05) [11]
    Удалено модератором
  • Виталий Панасенко (04.04.11 12:44) [12]
    select * from table1 t1 where not exists
    (select t2.date_out from table1 t2 where t1.id=t2.id and t2.date_out is null)
    не оно?
    я так понимаю, ID _ это ИД работника?
  • Кщд (04.04.11 13:49) [13]
    >Виталий Панасенко   (04.04.11 12:44) [12]
    distinct, т.к. записей м.б. > 1
  • Виталий Панасенко (04.04.11 14:04) [14]
    ну, это не суть.. впрочем, аналог

    > sniknik ©   (02.04.11 22:29) [5]

    только увидел :-)
 
Конференция "Базы" » Запрос списка уволенных [D7, FireBird]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]