Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询,将日期之间显示为特定日期+属于每个日期的数据!_Sql_Visual Studio 2008_Sql Server 2005 - Fatal编程技术网

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

这就是表格的呈现方式

将会有很多请求,我想总结一下每天需要的人员!,不在开始日期和结束日期之间

此外,我想分组的国家,并有可能设置之间的日期,我想获得数据

对于所需人员0,某些日期可能为空,但无论如何都应显示日期。 请注意,可能会有多个请求指出相同的日期和相同的国家,但活动会有所不同

查询应该是这样的,正如您所看到的,它不是SQL,只是试图显示逻辑

我希望看到这样的情况:

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参数时,它不接受日期作为输入。。。