Как решить этот 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
)