SQL QUERY, показывающий между датами как конкретные даты + данные, принадлежащие каждой дате! - PullRequest
1 голос
/ 24 июня 2010

Так выглядит таблица

SELECT RequestsID, Country, Activity,
[People needed (each day)], [Start date], [End date]
FROM dbo.Requests

Будет много запросов, и я хотел бы суммировать «Необходимых людей» за день (!), А не как между начальной и конечной датой.

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

Некоторые дни могут быть пустыми в отношении нужных людей (0), но Дата должна быть представлена ​​в любом случае. Обратите внимание, что может быть несколько запросов, указывающих на одни и те же даты и одну и ту же страну, но тогда действие будет другим.

Запрос должен быть похож (ну, это не SQL, как вы можете видеть, просто пытаетесь показать логику)

From Requests,
show Country and SUM 'People needed'
where (column not in Requests table-Date) is a Date (will be
a number of dates, I want to set the scope by a Start and End date)
and Requests.Country is @Country 
(and the Date(s) above of course is between the Requests Start date and End date...)
And from (a non existing table...?) show Date
Group by Country

Я бы хотел увидеть что-то вроде этого:

Date            Country         People needed

06/01/2010      Nigeria          34 // this might be from three different Requests, all pointing out Nigeria. People needed might be (30+1+3 = 34)
06/02/2010      Nigeria          10
06/03/2010      Nigeria           0
06/04/2010      Nigeria           1
06/05/2010      Nigeria         134

06/01/2010      China             2
06/02/2010      China             0
06/03/2010      China            14
06/04/2010      China            23
06/05/2010      China            33

06/01/2010      Chile             3
06/02/2010      Chile             4
06/03/2010      Chile             0
06/04/2010      Chile             0
06/05/2010      Chile            19

Как бы вы это сделали?

Примечание: Я хотел бы увидеть пример кода, чтобы начать: -)

Ответы [ 3 ]

2 голосов
/ 24 июня 2010

что-то вроде этого?

select d.Date, c.Country, sum(People) as PeopleNeeded 
from Dates d left join Requests r on d.Date between r.Start and r.End
group by d.Date, c.Country

, где Dates содержит соответствующий диапазон дат, как в ответе Каде Ру

2 голосов
/ 24 июня 2010

Обычно я бы предложил иметь статическую календарную таблицу, которая содержит последовательный список дат.Однако, используя умный подход Cade Roux по созданию таблицы календаря, вы получите что-то вроде:

;With Calendar As
    (
     Select Cast(Floor(Cast(@StartDate As float)) As datetime) As [Date]
     Union All
     Select DateAdd(d, 1, [Date])
     From Calendar
     Where DateAdd(d, 1, [Date]) < @EndDate
    )
Select C.[Date], R.Country, Sum(R.PeopleNeeded)
From Calendar As C
    Left Join Requests As R
        On C.[Date] Between R.[Start Date] And R.[End Date]
            And ( @Country Is Null Or R.Country = @Country )
Group By C.[Date], R.Country    
Option (MAXRECURSION 0); 

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

ДОПОЛНЕНИЕ

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

With Calendar As
    (
     Select Cast(Floor(Cast(@StartDate As float)) As datetime) As [Date]
     Union All
     Select DateAdd(d, 1, [Date])
     From Calendar
     Where DateAdd(d, 1, [Date]) < @EndDate
    )
Select C.[Date], C2.Country, Sum(R.PeopleNeeded)
From Calendar As C
    Cross Join Countries As C2
    Left Join Requests As R
        On C.[Date] Between R.[Start Date] And R.[End Date]
            And R.CountryId = C2.CountryId
Group By C.[Date], C2.Country    
Option (MAXRECURSION 0); 
2 голосов
/ 24 июня 2010

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

Техника, аналогичная , обсуждаемой здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...