SUM(值)其中{date filter)在聚合查询中

时间:2017-06-25 00:11:36

标签: sql sql-server select temp-tables

我正在为临时表(details here)进行聚合查询,需要在日期范围内过滤总和部分。

我的查询是:

insert @temp2(name, cost) 
    select ename6, sum(dqr.cost)
    from dbo.condensed7day_query_result dqr
    group by dqr.ename6;

但是,我需要总和(dqr.cost)实际上是

sum(dqr.cost) (dbo.condensed7day_query_result.start_date >= @StartDate) and (dbo.condensed7day_query_result.start_date <= @EndDate)

如果sum()null(没有返回任何行),我希望它是0,但如果它是空的则可以。但是,我需要该行,因为我需要名称(ename6)。

如果相关,这是在SQL Server中构建临时表的一部分。

3 个答案:

答案 0 :(得分:1)

易:

insert @temp2(name, cost)
select ename6,
  sum(
    case when dqr.start_date >= @StartDate and dqr.start_date <= @EndDate then dqr.cost
    else 0 end
  )
from dbo.condensed7day_query_result dqr
group by dqr.ename6;

答案 1 :(得分:0)

我认为您可以使用以下条件进行过滤:

insert @temp2(name, cost) 
  select ename6, sum(dqr.cost)
  from dbo.condensed7day_query_result dqr
  where dqr.start_date >= @startDate and dqr.start_date <= @EndDate
  group by dqr.ename6;

答案 2 :(得分:0)

您可以使用此代码

insert @temp2(name, cost) 
Select ename6,cost from
( select ename6, IsNull(sum(dqr.cost),0) as cost
    from dbo.condensed7day_query_result dqr
    where (start_date >= @StartDate) and (start_date <= @EndDate)   
    group by dqr.ename6
) Temp
union 
(   Select ename6 , 0 as cost
    from dbo.condensed7day_query_result
    where ename6 not in ( 
    Select distinct ename6 
            from dbo.condensed7day_query_result dqr
            where (dqr.start_date >= @StartDate) and (dqr.start_date <= @EndDate)   
    )
)

在Sql中,您可以在GroupByClause之前使用Whereclause,因此在Whereclause之后,Aggregatefunction将在resltset上运行。 当Sum的结果为null时,您还可以使用Isnull函数返回0值。第二个Select返回@StartDate和@EndDate范围内不存在的记录。