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

Откуда:
Сообщений: 49
Коллеги, доброго времени суток.

Помогите решить задачку.

Дано:

USE tempdb
GO

CREATE TABLE DateTable (DateID date)

DECLARE @DateID date
SET @DateID = '2014-01-01'

WHILE @DateID < = '2014-01-31'
BEGIN
	INSERT INTO DateTable VALUES(@DateID)
	SET @DateID = DATEADD(dd, 1, @DateID)
END

CREATE TABLE GrafikRabot (DateID date, FIO varchar(50))
INSERT INTO GrafikRabot VALUES('2014-01-01', 'Дядя Петя')
INSERT INTO GrafikRabot VALUES('2014-01-11', 'Дядя Федя')
INSERT INTO GrafikRabot VALUES('2014-01-15', 'Тётя Маша')
INSERT INTO GrafikRabot VALUES('2014-01-17', 'Тётя Клава')
INSERT INTO GrafikRabot VALUES('2014-01-29', 'Дядя Петя')


Запрос с Full Join возвращает Null для несуществующих пар:
SELECT d.DateID, g.FIO FROM DateTable d FULL Join GrafikRabot g  ON (g.DateID = d.DateID)


А нужно получить результат вида:

DateID FIO
---------- -----------------
2014-01-01 Дядя Петя
2014-01-02 Дядя Петя
2014-01-03 Дядя Петя
2014-01-04 Дядя Петя
2014-01-05 Дядя Петя
2014-01-06 Дядя Петя
2014-01-07 Дядя Петя
2014-01-08 Дядя Петя
2014-01-09 Дядя Петя
2014-01-10 Дядя Петя
2014-01-11 Дядя Федя
2014-01-12 Дядя Федя
2014-01-13 Дядя Федя
2014-01-14 Дядя Федя
2014-01-15 Тётя Маша
2014-01-16 Тётя Маша
2014-01-17 Тётя Клава
2014-01-18 Тётя Клава
2014-01-19 Тётя Клава
2014-01-20 Тётя Клава
2014-01-21 Тётя Клава
2014-01-22 Тётя Клава
2014-01-23 Тётя Клава
2014-01-24 Тётя Клава
2014-01-25 Тётя Клава
2014-01-26 Тётя Клава
2014-01-27 Тётя Клава
2014-01-28 Тётя Клава
2014-01-29 Дядя Петя
2014-01-30 Дядя Петя
2014-01-31 Дядя Петя
27 янв 14, 14:09    [15475171]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть по датам исторические данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kopilogus
Запрос с Full Join возвращает Null для несуществующих пар:

Ну так придется для каждой записи из DateTable искать запись из GrafikRabot
Или в GrafikRabot добавить еще поле "конец периода"
Выбирайте
27 янв 14, 14:14    [15475215]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть по датам исторические данные  [new]
Kopilogus
Member

Откуда:
Сообщений: 49
Если нет других идей, будем так и делать.
27 янв 14, 14:23    [15475298]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть по датам исторические данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kopilogus
Если нет других идей, будем так и делать.

Отсутствующие данные придется генерировать. Они же отсутствуют
27 янв 14, 14:26    [15475324]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть по датам исторические данные  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Зачем FULL JOIN, если в DateTable есть все дни января?
SELECT D.DateID, T.FIO
FROM DateTable D
CROSS APPLY(SELECT TOP(1) * FROM GrafikRabot G WHERE G.DateID<=D.DateID ORDER BY G.DateID DESC) T;
27 янв 14, 14:27    [15475339]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть по датам исторические данные  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Может, точнее OUTER APPLY.
Можно и коррелированный подзапрос в поле SELECTа
27 янв 14, 14:29    [15475366]     Ответить | Цитировать Сообщить модератору
 Re: Развернуть по датам исторические данные  [new]
Kopilogus
Member

Откуда:
Сообщений: 49
iap
Может, точнее OUTER APPLY.
Можно и коррелированный подзапрос в поле SELECTа


На тестовых данных отработало отлично.
Попробую применить в рабочей среде.
Спасибо, iap!
27 янв 14, 14:38    [15475471]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить