Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом  [new]
San4ooo
Member

Откуда:
Сообщений: 83
Привет всем

Ситуация такая. в упрощенном варианте. Есть таблицы
main_t1 (id1 int, id2 int, v int, d1 date, d2 date),
t2 (id int, id2 int, v2 int, d1 date, d2 date),
v(v_id int, name varchar)
v2(v_id int, name varchar)

где
main_t1 t1
join t2 on t1.id2 = t2.id2
join v on t1.v = v.v_id
join v2 on t2.v2 = v2.v_id
т.е. у таблица main_t1 либо может быть ссылка на t2 у некоторых id1, а может не быть.
Далее даты в таблице main_id указывают на период, Если у таблицы main_id есть ссылки на таблицу t2 то этот период обрывается на тех датах которые в таблице t2. По одной ссылки id2 таблицы main_t1 может быть несколько записей в таблице t2, а значит и несколько периодов. т.е. количество этих периодов м.б. неограничено.

Требуется вывести все значения(v.name, v2.name) при каком либо периоде.
т.е. надо в зависимости от наличия/неналичия ссылки на t2 обрывать основной период датой начала дополнительного(t2.d1) и поочередно вывести все периоды из таблицы t2 где main_t1.id2 = t2.id2. Какой запрос должен быть?
6 сен 11, 23:55    [11238147]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
San4ooo,

а проблема-то в чем? Используйте LEFT JOIN для присоединения t2, ISNULL для рассчета периодов.
7 сен 11, 00:54    [11238202]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
TERn
Member

Откуда: Москва
Сообщений: 51
San4ooo,

если хотите получить текст запроса, приведите:
- скрипты создания таблиц;
- скрипты заполнения этих таблиц тестовыми данными;
- описание желаемого результата на примере тестовых данных.
7 сен 11, 12:46    [11240020]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
TERn
San4ooo,

если хотите получить текст запроса, приведите:
- скрипты создания таблиц;
- скрипты заполнения этих таблиц тестовыми данными;
- описание желаемого результата на примере тестовых данных.


Все проще, просто дается пинок линк в направлении Рекомендации по оформлению сообщений в форуме.
7 сен 11, 13:11    [11240216]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
San4ooo
Member

Откуда:
Сообщений: 83
ОК

Скрипт создания таблиц
create table main_t1 (id1 int, id2 int, v int, d1 date, d2 date), 
create table t2 (id int, id2 int, v2 int, d1 date, d2 date), 
create table v (v_id int, name varchar) 
create table v2 (v_id int, name varchar) 

скрипты заполнения этих таблиц тестовыми данными :


	
insert v values (1, 'по умолчанию')
insert v2 values (1, 'дополнение 1')
insert v2 values (2, 'дополнение 2')
insert v2 values (3, 'дополнение 3')
	


insert main_t1 values (1, 11, 1, '20110803', '20110805')
insert main_t1 values (2, 22, 1, '20110809', '20110817')
insert main_t1 values (3, 33, 1, '20110811', '20110825')
insert main_t1 values (3, 44, 1, '20110901', '20110925')

select * from main_t1

insert v values (1, 'по умолчанию')
insert t2 values (1, 22, 1, '20110811','20110817')
insert t2 values (2, 33, 2, '20110813','20110830')
insert t2 values (3, 33, 2, '20110816','20110830')
insert t2 values (4, 44, 3, '20110916','20110830')
insert t2 values (5, 44, 3, '20110919','20110830')
insert t2 values (6, 44, 3, '20110923','20110830')
select * from t2

Значения выглядят как во вложении
Взаимосвязь таблиц такая:

from main_t1
 join t2 on main_t1.id2 = t2.id2
	join v on main_t1.v = v.v_id
	join v2 on t2.v2 = v2.v_id


описание желаемого результата на примере тестовых данных

Надо вывести такое:

id1 id2 v d1 d2
1 11 по умолчанию 03/08/2011 05/08/2011
2 22 по умолчанию 09/08/2011 11/08/2011
2 22 дополнение 1 11/08/2011 17/08/2011
3 33 по умолчанию 11/08/2011 13/08/2011
3 33 дополнение 2 13/08/2011 16/08/2011
3 33 дополнение 2 16/08/2011 30/08/2011
4 44 по умолчанию 01/09/2011 16/09/2011
4 44 дополнение 3 16/09/2011 19/09/2011
4 44 дополнение 3 19/09/2011 23/09/2011
4 44 дополнение 3 23/09/2011 30/08/2011

Пояснения в зависимости от наличия/неналичия id2 из таблицы main_t1 в таблице t2 подставляются(если есть) соответственные даты и значение из этой таблицы. Причем при добавлении конечная дата предыдущей строки по одному id1 заменяется на начальную дату текущей(срок по умолчанию разбивается на количество дополнительных промежутков)

Вопрос: как этот вывод реализовать в SQL имея такие условия?

К сообщению приложен файл. Размер - 40Kb
7 сен 11, 16:06    [11242094]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
San4ooo,

я же сказал - для соединения с t2 используйте left jion, а дальше считайте свои интервалы как хотите, ISNULL вам в помощь.
7 сен 11, 17:25    [11242903]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
San4ooo,

USE tempdb
GO
DROP TABLE main_t1
DROP TABLE t2
DROP TABLE v
DROP TABLE v2
go
create table main_t1 (id1 int, id2 int, v int, d1 date, d2 date)
go
create table t2 (id int, id2 int, v2 int, d1 date, d2 date)
go
create table v (v_id int, name varchar(15)) 
go
create table v2 (v_id int, name varchar(15)) 
GO
insert v values (1, 'по умолчанию')
insert v2 values (1, 'дополнение 1')
insert v2 values (2, 'дополнение 2')
insert v2 values (3, 'дополнение 3')
insert main_t1 values (1, 11, 1, '20110803', '20110805')
insert main_t1 values (2, 22, 1, '20110809', '20110817')
insert main_t1 values (3, 33, 1, '20110811', '20110825')
insert main_t1 values (4, 44, 1, '20110901', '20110925')
insert t2 values (1, 22, 1, '20110811','20110817')
insert t2 values (2, 33, 2, '20110813','20110830')
insert t2 values (3, 33, 2, '20110816','20110830')
insert t2 values (4, 44, 3, '20110916','20110830')
insert t2 values (5, 44, 3, '20110919','20110830')
insert t2 values (6, 44, 3, '20110923','20110830')
GO
;With tblDifference as
(
Select Row_Number() OVER (PARTITION BY id2 Order by id2,d1) as RowNumber,* FROM
(
select * from main_t1 INNER JOIN v ON main_t1.v = v.v_id
UNION ALL
select main_t1.id1,main_t1.id2,v2,t2.d1,t2.d2,v2.v_id,v2.name from t2 INNER JOIN
v2 ON t2.v2 = v2.v_id INNER JOIN
main_t1 ON main_t1.id2 = t2.id2
) AS innerTable
)
SELECT Cur.id1,Cur.id2,Cur.v,Cur.name, Cur.d1, ISNULL(Prv.d1,Cur.d2) AS d2
FROM tblDifference Cur Left Outer Join tblDifference Prv
On Cur.RowNumber=Prv.RowNumber-1 AND Cur.id2=Prv.id2
Order by Cur.id2,Cur.d1
/*
Result:
=======
id1	id2	v	name	d1	d2
1	11	1	по умолчанию	2011-08-03	2011-08-05
2	22	1	по умолчанию	2011-08-09	2011-08-11
2	22	1	дополнение 1	2011-08-11	2011-08-17
3	33	1	по умолчанию	2011-08-11	2011-08-13
3	33	2	дополнение 2	2011-08-13	2011-08-16
3	33	2	дополнение 2	2011-08-16	2011-08-30
4	44	1	по умолчанию	2011-09-01	2011-09-16
4	44	3	дополнение 3	2011-09-16	2011-09-19
4	44	3	дополнение 3	2011-09-19	2011-09-23
4	44	3	дополнение 3	2011-09-23	2011-08-30
*/
7 сен 11, 21:09    [11244041]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
San4ooo
Member

Откуда:
Сообщений: 83
SamMan ты бог! спасибо!
11 сен 11, 18:59    [11260830]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить