我正在为临时表(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中构建临时表的一部分。
答案 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范围内不存在的记录。