2017-06-25 39 views
0

我正在爲臨時表(details here)執行聚合查詢,並且需要過濾日期範圍內的總和部分。SUM(value)其中{日期過濾器)在聚合查詢中

查詢我的是:

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中構建臨時表(如果相關)的一部分。

回答

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; 
0

我認爲你可以使用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; 
+0

因爲where子句適用於一切,我不再讓所有的名字那是行不通的。 –

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等聚合函數會後resltset工作Whereclause。 當Sum的結果爲空時,您也可以使用Isnull函數返回0值。第二個Select返回@StartDate和@EndDate範圍中不存在的記錄。