MSFT SQL Server - Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?

Ответить
Аватара пользователя
elec

MSFT SQL Server - Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?

Сообщение elec »

Добрый день уважаемые форумчане.

Прошу вас помочь в решении следующей задачи.





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.

Заранее благодарю за любую помощь в обсуждении.
Аватара пользователя
lxa85

Re: MSFT SQL Server - Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?

Сообщение lxa85 »

elec, сделай доброе дело -- выдели одну из таблиц (например вторую) жирным шрифтом в совокупности таблиц. Вам, как автору видно разницу, мне, как человеку "с луны" ваще ее не видно! Где она?

И еще, приведи пожалуйста сценарии создания таблиц и, если получится, тестовый набор данных.
Аватара пользователя
Delirium

Re: MSFT SQL Server - Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?

Сообщение Delirium »

Цитата elec:



Платформа MS SQL 2000
MSFT SQL Server - Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?




Серьезно? Оно еще живо?



Я тоже ничего не понял. Оформляй списки тегами, выделяем что нужно и половина вопроса сама решится, вот увидишь. Задача, судя по всему, тривиальная, но вот вопрос поставлен жутко криво.
Аватара пользователя
elec

Re: MSFT SQL Server - Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?

Сообщение elec »

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





Вот такая задача. Сейчас понятно?
Аватара пользователя
lxa85

Re: MSFT SQL Server - Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?

Сообщение lxa85 »

elec, да откуда берется столько значений?!

Из приведенного примера.
Входные данные:




001 -- 3 шт.

002 -- 2 шт.

003 -- 1 шт.

00N -- 2 шт.





А получаем




1 - 5

2 - 3

N - 3 !




Это что за метаморфоза?

Даты вообще плодятся в страшном кол-ве. От них в глазах рябит. Попросил же, выделить жирным тегом


Код для 2008R2 сервера






PHP код:

Код: Выделить всё

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
и порядок сортировки ORDER BY.
Аватара пользователя
elec

Re: MSFT SQL Server - Как изменить периоды в таблице Т1 с учетом таблицы периодов Т2?

Сообщение elec »

Добрый день. Я может быть что-то некорректно написал.

В конторе 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, и т.д. Может быть кто-то вообще не болел.

Необходимо получить общую таблицу, в которой внутрь первой таблицы ставить периоды из второй таблицы.

Заранее неизвестно сколько будет у каждого сотрудника записей. Вот такая задача.
Ответить

Вернуться в «Программирование и базы данных»