Показать полную графическую версию : Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?
Добрый день уважаемые форумчане.
Прошу вас помочь в решении следующей задачи.
T1 - Таблица общего стажа по сотрудникам
Таб№ Начало Окончание
0001 01.01.2012 31.12.2012
0002 01.02.2012 25.12.2012
…… ………. ………..
000N 01.01.2012 31.12.2012
T2 - Таблица больничных листов сотрудников из Т1
Таб№ Начало Окончание
0001 15.01.2012 25.01.2012
0001 10.05.2012 15.05.2012
0002 01.02.2012 15.02.2012
…… ………… …………..
000N 03.10.2012 15.10.2012
Как из этих двух таблиц сделать третью, в котором стаж работы из Т1 разбит с учетом больничных листов из Т2.
Т.е. должно получиться сдедующее:
Таб№ Начало Окончание
0001 01.01.2012 14.01.2012
0001 15.01.2012 25.01.2012
0001 26.01.2012 09.05.2012
0001 10.05.2012 15.05.2012
0001 16.05.2012 31.12.2012
0002 01.02.2012 31.01.2012
0002 01.02.2012 15.02.2012
0002 16.02.2012 25.12.2012
….. ……. ……..
000N 01.01.2012 02.10.2012
000N 03.10.2012 15.10.2012
000N 16.10.2012 31/12.2012
Платформа MS SQL 2000.
Заранее благодарю за любую помощь в обсуждении.
elec, сделай доброе дело -- выдели одну из таблиц (например вторую) жирным шрифтом в совокупности таблиц. Вам, как автору видно разницу, мне, как человеку "с луны" ваще ее не видно! Где она?
И еще, приведи пожалуйста сценарии создания таблиц и, если получится, тестовый набор данных.
Delirium
18-03-2013, 17:01
Платформа MS SQL 2000 »
Серьезно? Оно еще живо?
Я тоже ничего не понял. Оформляй списки тегами, выделяем что нужно и половина вопроса сама решится, вот увидишь. Задача, судя по всему, тривиальная, но вот вопрос поставлен жутко криво.
set dateformat dmy
create table #t1 (id varchar(10), StDate datetime, EnDate datetime)
insert #t1 ((id, StDate , EnDate) select '0001', '01.01.2012', '31.12.2012'
insert #t1 ((id, StDate , EnDate) select '0002', '01.02.2012', '25.12.2012'
insert #t1 ((id, StDate , EnDate) select '0003', '01.01.2012', '31.12.2012'
insert #t1 ((id, StDate , EnDate) select '000N', '01.01.2012', '31.12.2012'
create table #t2 (id varchar(10), StDate datetime, EnDate datetime)
insert #t2 ((id, StDate , EnDate) select '0001', '15.01.2012', '25.01.2012'
insert #t2 ((id, StDate , EnDate) select '0001', '10.05.2012', '15.05.2012'
insert #t2 ((id, StDate , EnDate) select '0002', '01.02.2012', '15.02.2012'
insert #t2 ((id, StDate , EnDate) select '000N', '03.10.2012', '15.10.2012'
T1 - Таблица общего стажа по сотрудникам
Таб№ Начало Окончание
0001 01.01.2012 31.12.2012 сотрудник 1
0002 01.02.2012 25.12.2012 сотрудник 2
............................................................................................
000N 01.01.2012 31.12.2012 сотрудник N
-----------------------------------------------------------------------------------------------------------------------------
T2 - Таблица больничных листов сотрудников из Т1
Таб№ Начало Окончание
0001 15.01.2012 25.01.2012 сотрудник 1 болел с 15.01.2012 по 25.01.2012
0001 10.05.2012 15.05.2012 сотрудник 1 болел с 10.05.2012 по 15.05.2012
0002 01.02.2012 15.02.2012 и т.д.
...........................................................................
000N 03.10.2012 15.10.2012
--------------------------------------------------------------------------------------------------------------------
Т.е. должно получиться сдедующее:
Таб№ Начало Окончание
0001 01.01.2012 14.01.2012 сотрудник 1 работал с 01.01.2012 по 14.01.2012
0001 15.01.2012 25.01.2012 сотрудник 1 болел с 15.01.2012 по 25.01.2012
0001 26.01.2012 09.05.2012 сотрудник 1 работал с 26.01.2012 по 09.05.2012
0001 10.05.2012 15.05.2012 сотрудник 1 болел с 10.05.2012 по 15.05.2012
0001 16.05.2012 31.12.2012 сотрудник 1 работал с 16.05.2012 по 31.12.2012
0002 01.02.2012 31.01.2012 и т.д.
0002 01.02.2012 15.02.2012
0002 16.02.2012 25.12.2012
..........................................................
000N 01.01.2012 02.10.2012 сотрудник 1 работал с 01.01.2012 по 02.10.2012
000N 03.10.2012 15.10.2012 сотрудник 1 болел с 03.10.2012 по 15.10.2012
000N 16.10.2012 31.12.2012 сотрудник 1 работал 16.10.2012 по 31/12.2012
Вот такая задача. Сейчас понятно?
elec, да откуда берется столько значений?!
Из приведенного примера.
001 -- 3 шт.
002 -- 2 шт.
003 -- 1 шт.
00N -- 2 шт.
1 - 5
2 - 3
N - 3 !
Это что за метаморфоза?
Даты вообще плодятся в страшном кол-ве. От них в глазах рябит. Попросил же, выделить жирным тегом
DROP TABLE [oszone].[dbo].[t1];
set dateformat dmy;
create table t1 (id varchar(10), StDate datetime, EnDate datetime);
INSERT INTO T1
VALUES
('0001', '01.01.2012', '31.12.2012'),
('0002', '01.02.2012', '25.12.2012'),
('0003', '01.01.2012', '31.12.2012'),
('000N', '01.01.2012', '31.12.2012');
DROP TABLE [oszone].[dbo].[t2];
set dateformat dmy;
create table T2 (id varchar(10), StDate datetime, EnDate datetime);
INSERT INTO T2
VALUES
('0001', '15.01.2012', '25.01.2012'),
('0001', '10.05.2012', '15.05.2012'),
('0002', '01.02.2012', '15.02.2012'),
('000N', '03.10.2012', '15.10.2012');
SELECT [id]
,[StDate]
,[EnDate]
FROM [oszone].[dbo].[t1]
;
SELECT [id]
,[StDate]
,[EnDate]
FROM [oszone].[dbo].[t2]
;
SELECT
[oszone].[dbo].[t1].[id]
,[oszone].[dbo].[t1].[StDate]
,[oszone].[dbo].[t1].[EnDate]
FROM [oszone].[dbo].[t1]
UNION
SELECT
[oszone].[dbo].[t2].[id]
,[oszone].[dbo].[t2].[StDate]
,[oszone].[dbo].[t2].[EnDate]
FROM [oszone].[dbo].[t2]
ORDER BY
[oszone].[dbo].[t1].[id],
[oszone].[dbo].[t1].[StDate]
;
Обратить внимание на ключевое слово UNION (http://msdn.microsoft.com/ru-ru/library/ms180026.aspx) и порядок сортировки ORDER BY.
Добрый день. Я может быть что-то некорректно написал.
В конторе ZZZ в 2012 году работали N кол-во человек (сотрудников). В таблице t1 записаны данные:
сотрудник - дата поступления и дата увольнения. Поэтому в таблице N количество записей.
Таб№ Начало Окончание
0001 01.01.2012 31.12.2012
0002 01.02.2012 25.12.2012
............................................................................................
000N 01.01.2012 31.12.2012
Сотрудник 0001 в конторе ZZZ проработал с 01.01.2012 по 31.12.2012, сотрудник 0002 с 01.02.2012 по 25.12.2012 и т.д.
В 2012 году некоторые из них прихворали, может быть и не одному разу. В таблице t2 есть об этих случаях соответствующие записи:
0001 15.01.2012 25.01.2012
0001 10.05.2012 15.05.2012
0002 01.02.2012 15.02.2012
...........................................................................
000N 03.10.2012 15.10.2012
Т.е. сотрудник 0001 во время работы в конторе ZZZ хворал 2 раза с 15.01.2012 по 25.01.2012 и с 10.05.2012 по 15.05.2012. А сотрудник 0002 с 01.02.2012 по 15.02.2012, и т.д. Может быть кто-то вообще не болел.
Необходимо получить общую таблицу, в которой внутрь первой таблицы ставить периоды из второй таблицы.
Заранее неизвестно сколько будет у каждого сотрудника записей. Вот такая задача.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.