SQL查询,将日期之间显示为特定日期+属于每个日期的数据!
这就是表格的呈现方式 将会有很多请求,我想总结一下每天需要的人员!,不在开始日期和结束日期之间 此外,我想分组的国家,并有可能设置之间的日期,我想获得数据 对于所需人员0,某些日期可能为空,但无论如何都应显示日期。 请注意,可能会有多个请求指出相同的日期和相同的国家,但活动会有所不同 查询应该是这样的,正如您所看到的,它不是SQL,只是试图显示逻辑 我希望看到这样的情况:SQL查询,将日期之间显示为特定日期+属于每个日期的数据!,sql,visual-studio-2008,sql-server-2005,Sql,Visual Studio 2008,Sql Server 2005,这就是表格的呈现方式 将会有很多请求,我想总结一下每天需要的人员!,不在开始日期和结束日期之间 此外,我想分组的国家,并有可能设置之间的日期,我想获得数据 对于所需人员0,某些日期可能为空,但无论如何都应显示日期。 请注意,可能会有多个请求指出相同的日期和相同的国家,但活动会有所不同 查询应该是这样的,正如您所看到的,它不是SQL,只是试图显示逻辑 我希望看到这样的情况: Date Country People needed 06/01/2010
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
你会怎么做
注:
首先,我想看一些示例代码:-通常,我会使用一个包含所有日期的计数表或数据透视表,然后根据介于范围之间的日期进行联接
一种类似的技术。通常我会使用一个包含所有日期的计数表或数据透视表,然后根据介于范围之间的日期进行联接 类似的技术。类似的技术
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
其中日期包含适当的日期范围,如Cade Roux的回答中所示
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
如果日期包含一个适当的日期范围,如Cade Roux的回答一般,我建议使用一个静态日历表,其中包含一个连续的日期列表。但是,使用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);
现在,如果您希望在国家/地区上进行筛选,以使返回的天数仅为给定国家/地区具有数据的天数,那么您只需将左联接更改为内部联接
加成
根据评论,要求向所有国家表明是否有要求。为此,您需要交叉连接到Countries表:
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);
通常,我建议使用一个静态日历表,其中包含日期的顺序列表。但是,使用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);
现在,如果您希望在国家/地区上进行筛选,以使返回的天数仅为给定国家/地区具有数据的天数,那么您只需将左联接更改为内部联接
加成
根据评论,要求向所有国家表明是否有要求。为此,您需要交叉连接到Countries表:
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);
看起来很有趣,在我的visual studio query builder中进行了测试-但是,在执行时,出现了错误消息:无效对象名称“Date”有什么想法吗?这是我不想要的响应:-但感谢原始答案,这似乎是一种前进的方式。不过,我想对我的评论问题给出一个真实的答案……对不起,选择“日期”作为专栏名称可能是我的错。这将是一个保留字,您可以使用方括号引用它,因此:[Date]。但是,将其更改为“ActivityDate”或类似的名称会更容易。事实上,无论我如何称呼Date,都会出现相同的错误消息-例如,如果我将其命名为d.Datovitje,它会抱怨对象名称无效“Datovitje”。。。我必须在其他地方定义虚拟列吗?看起来很有趣,在我的visual studio查询生成器中进行了测试-尽管在执行时,出现了错误消息:无效对象名称“日期”有什么想法吗?这是我不希望看到的回应:-但感谢原始答案,这似乎是一种前进的方式。不过,我想对我的评论问题给出一个真实的答案……对不起,选择“日期”作为专栏名称可能是我的错。这将是一个保留字,您可以使用方括号引用它,因此:[Date]。但是,将其更改为“ActivityDate”或类似的名称会更容易。事实上,无论我如何称呼Date,都会出现相同的错误消息-例如,如果我将其命名为d.Datovitje,它会抱怨对象名称无效“Datovitje”。。。我必须在其他地方定义虚拟列吗?这看起来也很有趣,在我的visual studio查询生成器中对其进行了测试-但是,在执行时,出现了错误消息:必须声明标量变量@StartDate、@EndDate、@Country。有什么想法吗?@jackjohnstone-这些代表了你想要过滤的参数。如果要将代码放入SQL Server Management Studio以执行它,则需要将这些作为参数添加到查询或存储过程中,或者只需添加带有Set语句的Declare语句。是的,我知道它们是参数:-我实际上偶尔使用参数。但是当我使用它们的时候,我没有得到那个错误信息,这让我很困惑。。。我将尝试在ManagementStudio中修复此问题,但无论如何,我将通过VisualStudio中的数据集访问它,因此它最终必须在那里工作。或我不极端
杰克·约翰斯通——如果你想测试它,只需用单引号括起来的实际日期替换@StartDate和@EndDate,例如“2010-06-24”,用单引号括起来的数据库中的国家名称替换@Country即可。问题是;在代码的开头和结尾-然而,它还不起作用,但我将尝试以某种方式修复它。我不清楚的一件事是,为什么要将开始日期转换为浮动日期?当使用@StartDate参数时,它不接受日期作为输入…这看起来也很有趣,在我的visual studio查询生成器中对其进行了测试-但是,在执行时,出现错误消息:必须声明标量变量@StartDate、@EndDate、@Country。有什么想法吗?@jackjohnstone-这些代表了你想要过滤的参数。如果要将代码放入SQL Server Management Studio以执行它,则需要将这些作为参数添加到查询或存储过程中,或者只需添加带有Set语句的Declare语句。是的,我知道它们是参数:-我实际上偶尔使用参数。但是当我使用它们的时候,我没有得到那个错误信息,这让我很困惑。。。我将尝试在ManagementStudio中修复此问题,但无论如何,我将通过VisualStudio中的数据集访问它,因此它最终必须在那里工作。或我不是非常愚蠢,但对数据库和数据集来说是相当陌生的。@Jack Johnstone-如果你想测试它,只需将@StartDate和@EndDate替换为用单引号括起来的实际日期,例如“2010-06-24”,并将@Country替换为数据库中用单引号括起来的国家名称。问题在于;在代码的开头和结尾-然而,它还不起作用,但我将尝试以某种方式修复它。我不清楚的一件事是,为什么要将开始日期转换为浮动日期?当使用@StartDate参数时,它不接受日期作为输入。。。