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

SUM(value) where {date filter) is in an aggregation query

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

我的查询是:

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

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

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

如果 sum()null(没有返回行),我希望它是 0,但如果它是 null 也没关系。但是,我需要该行,因为我需要名称 (ename6).

如果相关,这是在 SQL 服务器中构建临时 table 的一部分。

我认为您可以使用 where 条件进行过滤,如下所示:

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;

您可以使用此代码

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,因此 Aggregatefunction 将在 Whereclause 之后对 resltset 起作用。 当 Sum 的结果为 null 时,您也可以使用 Isnull 函数将 return 0 值。第二个 Select returns 是@StartDate 和@EndDate 范围内不存在的记录。

简单:

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;