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

Откуда: Australia
Сообщений: 88
Подскажите пожалуйста место на форуме или ключевые слова по которым я могу найти решение такой или похожей задачи:

Есть таблицы:

Гостиница ()

Журнал (
Гостиница
Посетитель
Въехал
Выехал )

Нужно получить ответ на вопрос сколько человек проживало в гостинице каждый день за период (желательно одним запросом).
Например: период 01/07/20011 03/07/2011
Результат:
01/07/20011 - Шератон - 23
01/07/20011 - Мираж - 10
01/07/20011 - Космос - 0
02/07/20011 - Шератон - 25
02/07/20011 - Мираж - 3
02/07/20011 - Космос - 0
03/07/20011 - Шератон - 25
03/07/20011 - Мираж - 0
03/07/20011 - Космос - 0

То есть в результате присутствуют все гостиницы (даже те для которых нет ни однои записи в журнале за период).

Далее сделав группировку можно получить (с этим вопросов нет):
01/07/20011 - 33
02/07/20011 - 28
03/07/20011 - 25
или
Шератон - 73
Мираж - 13
Космос - 0
ну или же просто
86

Уверен что ответ был дан токо не могу его найти. Спасибо.

P.S. SQL сервер всё ещё 2000
14 июл 11, 13:15    [10973197]     Ответить | Цитировать Сообщить модератору
 Re: Количество проживающих за каждый день  [new]
Glory
Member

Откуда:
Сообщений: 104751
Берете таблицу со всеми календарными днями,соединяете ее с вашей и группируете
14 июл 11, 13:21    [10973269]     Ответить | Цитировать Сообщить модератору
 Re: Количество проживающих за каждый день  [new]
IgorTaDaDaDa
Member

Откуда: Australia
Сообщений: 88
То есть вот так как посоветовал многоуважаемый tpg?

Нарастающая дата в запросе
14 июл 11, 13:32    [10973367]     Ответить | Цитировать Сообщить модератору
 Re: Количество проживающих за каждый день  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 600
Glory
Берете таблицу со всеми календарными днями,соединяете ее с вашей и группируете


угу... как-то так
if object_id ('hotel') is not null
	drop table dbo.hotel
go

if object_id ('log') is not null
	drop table dbo.log

go

if OBJECT_ID ('calendar') is not null
	drop table dbo.calendar

create table dbo.hotel (id int identity (1,1), name nvarchar(50))	
go
create table dbo.log (id int identity (1,1), id_hotel int, id_user int,  dt1 datetime, dt2 datetime )
go
create table dbo.calendar (dt  datetime)
go


insert into dbo.hotel values ('Шератон ')
insert into dbo.hotel values ('Мираж')
insert into dbo.hotel values ('Космос')

go

select * from hotel
go

insert into dbo.log values (1, 1, '20110101', '20110102')
insert into dbo.log values (2, 3, '20110101', '20110103')
insert into dbo.log values (1, 2, '20110102', '20110104')
insert into dbo.log values (3, 4, '20110102', '20110103')
insert into dbo.log values (3, 1, '20110109', '20110110')
go

insert into dbo.calendar values ('20101231')
insert into dbo.calendar values ('20110101')
insert into dbo.calendar values ('20110102')
insert into dbo.calendar values ('20110103')
insert into dbo.calendar values ('20110104')
insert into dbo.calendar values ('20110105')
insert into dbo.calendar values ('20110106')
insert into dbo.calendar values ('20110107')
insert into dbo.calendar values ('20110108')
insert into dbo.calendar values ('20110109')
insert into dbo.calendar values ('20110110')
insert into dbo.calendar values ('20110111')
go

select * 
from log

select dt, id_hotel, COUNT(id_user) cnt
from calendar c left join log l on c.dt between l.dt1 and l.dt2 
group by dt, id_hotel
order by dt, id_hotel

14 июл 11, 13:36    [10973392]     Ответить | Цитировать Сообщить модератору
 Количество проживающих за каждый день: спасибо всем  [new]
IgorTaDaDaDa
Member

Откуда: Australia
Сообщений: 88
Спасибо всем.
14 июл 11, 16:51    [10975228]     Ответить | Цитировать Сообщить модератору
 Количество проживающих за каждый день: ноне живущие постояльцы  [new]
IgorTaDaDaDa
Member

Откуда: Australia
Сообщений: 88
Естественно dt2 (дата отъезда) может быть NULL:

select dt, id_hotel, COUNT(id_user) cnt
from calendar c left join log l on c.dt between l.dt1 and l.dt2 

Будет ли правильным сделать так?

select dt, id_hotel, COUNT(id_user) cnt
from calendar c left join log l on c.dt between l.dt1 and ISNULL(l.dt2,c.dt)
14 июл 11, 18:15    [10975784]     Ответить | Цитировать Сообщить модератору
 Re: Количество проживающих за каждый день  [new]
дет
Guest
IgorTaDaDaDa,

Думаю, так не совсем корректно будет

лучше так:

select dt, id_hotel, COUNT(id_user) cnt
from calendar c left join log l on c.dt between l.dt1 and ISNULL(l.dt2,getdate())
14 июл 11, 18:21    [10975812]     Ответить | Цитировать Сообщить модератору
 Количество проживающих за каждый день: дата отъезда не считается датой проживания  [new]
IgorTaDaDaDa
Member

Откуда: Australia
Сообщений: 88
дет
Думаю, так не совсем корректно будет

лучше так:

select dt, id_hotel, COUNT(id_user) cnt
from calendar c left join log l on c.dt between l.dt1 and ISNULL(l.dt2,getdate())


Почему? Ведь сама дата будучи верхним пределом всегда вернёт TRUE. Уже исправил - просто интересуюсь :)

Если дата отъезда не считается датой проживания то так:

... AND ISNULL(DATEADD(day, -1, l.dt2), GETDATE())
14 июл 11, 18:36    [10975888]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить