Как решить этот SQL-запрос (заголовок и детализация)?

Я работаю с SQL Server 2008 R2.

у меня есть вопрос SQL-запроса, связанный с таблицами заголовков и подробностей. У меня есть таблица заголовков, где я храню location & department & week_start_date. У меня есть подробная таблица, где я храню employee_id & job_code & work_date & часы.

Я хочу найти тех сотрудников, которые находятся в разных заголовках с тем же week_start_date, но в другом месте и/или отделе.

здесь объяснение:


у меня есть заголовок стол:

CREATE TABLE header (
    header_id bigint not null PRIMARY KEY,
    location_code int not null,
    department_code int not null,
    week_start_date datetime not null )

у меня есть деталь стол:

CREATE TABLE detail (
    detail_id bigint not null PRIMARY KEY,
    header_id bigint not null FOREIGN KEY header(header_id),
    employee_id int not null,
    job_code int not null,
    work_date datetime not null,
    hours decimal(8,2) not null )

заголовок таблица имеет уникальный ключ как location_code + department_code + week_start_date.

например, это данные в заголовок стол:

header_id=11, location_code=22, department_code=33, week_start_date= '2016-02-08'

header_id=12, location_code=22, department_code=39, week_start_date= '2016-02-08'

header_id=13, location_code=22, department_code=33, week_start_date= '2016-02-15'

header_id=14, location_code=21, department_code=33, week_start_date= '2016-02-08'

в каждой строке заголовок таблица может иметь несколько строк в деталь таблица.

деталь таблица имеет уникальный ключ, как header_id + ид_сотрудника + job_code + work_date.

например, это данные в деталь таблица для 1000598 employee_id:

detail_id=101, header_id=11, ид_сотрудника=1000598, job_code=77, work_date='2016-02-08', часов=5.00

detail_id=102, header_id=11, ид_сотрудника=1000598, job_code=77, work_date= '2016-02-09', часы=4.00

detail_id=109, header_id=12, ид_сотрудника=1000598, job_code=79, work_date= '2016-02-11', часы=4.50

например, это данные в деталь таблица для 1000599 employee_id:

detail_id=121, header_id=11, employee_id=1000599, job_code=78, 2016-02-10 work_date='', ч=8.00

detail_id=122, header_id=14, employee_id=1000599, job_code=75, 2016-02-12 work_date='', ч=3.00

например, это данные в деталь стол для Ид_сотрудника 1000600:

detail_id=131, header_id=11, ид_сотрудника=1000600, job_code=72, work_date= '2016-02-11', часов=7.00

detail_id=132, header_id=13, ид_сотрудника=1000600, job_code=75, 2016-02-17 work_date='', ч=3.00

SQL-запрос должен возвращать 1000598 ид_сотрудника как 1000598 данные для department_code=33 и department_code=39 за те же week_start_date='2016-02-08'.

SQL-запрос должен возвращение 1000599 ид_сотрудника как 1000599 имеет данные для location_code=22 и location_code=21, за этот же week_start_date='2016-02-08'.

SQL-запрос не должен возвращать 1000600 employee_id.


это начало, которое я придумал:

select 
   h.employee_id, 
   d.week_start_date
from 
   header h (nolock) 
      inner join detail d (nolock) 
         on h.header_id = d.header_id 
group by 
   h.employee_id, 
   d.week_start_date
order by 
   1, 
   2  

не много.

1 ответов


Я хочу найти тех сотрудников, которые находятся в разных заголовков с одинаковыми week_start_date, но другое местоположение и / или отдел.

запрос вернет все (employee_id, week_start_date) пары, которые имеют более 1 location_code или department_code

select d.employee_id, h.week_start_date
from detail d
join header h on h.header_id = d.header_id
group by d.employee_id, h.week_start_date -- employees with same week_start_date
having (
  count(distinct h.location_code) > 1 -- have more than 1 location
  or count(distinct h.department_code) > 1 -- or more than 1 department
)