2014-02-18 2 views
0

Я не уверен, что это правильно, любой может вести меня по этому вопросу. Я пытаюсь получить мой номер гостевого знака в день в течение 1 месяца, но там привязан к какому-то пустому графу, где ни один не подписывать. Так что результат будет, какSQL WITH CLAUSE для DATERANGE Выберите

DATE  |  COUNT 
2013-12-01   2 
2013-12-05   4 

Но что я хотел это

DATE  |  COUNT 
2013-12-01   2 
2013-12-02   0 
2013-12-03   0 
2013-12-04   0 
2013-12-05   4 

, так что я нашел на этом сайте, чтобы использовать рекурсивную дату генерации, а затем логически я решил выбрать конечный результат даты и присоединиться к моему члену выбрать.

DECLARE @startDate DATE 
DECLARE @endDate DATE 

SET @startDate = '2013-12-01' 
SET @endDate = '2014-01-01' 
; 
WITH dates(Date) AS 
(
    SELECT @startdate as Date 
    UNION ALL 
    SELECT DATEADD(d,1,[Date]) 
    FROM dates 
    WHERE DATE < @enddate 
) 

SELECT dates.Date, COUNT(Guest.Identity) 
FROM [Membership].[dbo].[Guest] 
right join 
dates 
on 
Dates.Date = Guest.SignInDateTime and 
Guest.SignInDateTime >= @startdate and 
Guest.SignInDateTime < @enddate and 
DATEPART(hh, Guest.SignInDateTime) >= 10 and 
DATEPART(hh, Guest.SignInDateTime) <= 13 
GROUP BY DATEPART(d, dates.Date) 
ORDER BY dates.Date asc 

Но я столкнуться с ошибкой, как dates.Date недопустим в списке выбора, поскольку он не содержится ни в статистической функции или предложения GROUP BY. Кто-нибудь может направить меня на это или есть лучший способ сделать это? Заранее спасибо

ответ

0

Вы группируете DATEPART(d, dates.Date), но выбираете dates.date. Я думаю, что вы хотите что-то вроде этого:

SELECT DATEPART(d, dates.Date), COUNT(Guest.Identity) 
FROM [Membership].[dbo].[Guest] 
    right join dates on 
     Dates.Date = Guest.SignInDateTime and 
     Guest.SignInDateTime >= @startdate and 
     Guest.SignInDateTime < @enddate and 
     DATEPART(hh, Guest.SignInDateTime) >= 10 and 
     DATEPART(hh, Guest.SignInDateTime) <= 13 
GROUP BY DATEPART(d, dates.Date) 
ORDER BY DATEPART(d, dates.Date) asc 

ПРЕВРАЩЕНИЯ над SQL, предполагая, что SignInDateTime содержит метку времени, то этот запрос не может вернуть желаемых результатов, так как Dates.Date просто дата. Может быть, вы на самом деле хотите присоединиться только на дату (и, как Гордон отметил, групповым dates.date):

SELECT dates.Date, COUNT(Guest.Identity) 
FROM Dates left join [Membership].[dbo].[Guest] on 
     Dates.Date = cast(Guest.SignInDateTime as date) and 
     Guest.SignInDateTime >= @startdate and 
     Guest.SignInDateTime < @enddate and 
     DATEPART(hh, Guest.SignInDateTime) >= 10 and 
     DATEPART(hh, Guest.SignInDateTime) <= 13 
GROUP BY dates.Date 
ORDER BY dates.Date asc 
+0

я попробовать последний метод из sgeddes, что я получил почти правильно за 1-й день, за исключением месяца всегда будет давать мне двойной счет. Например. 2013-12-01 должен иметь 5 счет, но результат покажет мне 10 очков. Я стараюсь использовать все другое время входа и первый день всегда будет возвращать мне двойной счет. Любая идея почему? – user2378645

0

Изменить group by к:

GROUP BY dates.Date 

Вы, вероятно, не хотите группы в день месяца, в любом случае. Полная дата более полезна.