2017-06-25 4 views
0

Ich mache eine Aggregation Abfrage für eine temporäre Tabelle (details here) und müssen die Summe Teil in einem Datumsbereich filtern.SUM (Wert) wo {Datum Filter) ist in einer Aggregation Abfrage

Die Abfrage ich habe, ist:

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

Ich brauche aber die Summe (dqr.cost) tatsächlich

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

zu sein Und wenn die sum() ist eine null (keine Zeilen zurückgegeben) Ich würde es vorziehen, eine 0 zu sein, aber es ist in Ordnung, wenn es ein Null ist. Allerdings brauche ich diese Zeile, weil ich den Namen brauche (ename6).

Dies ist Teil der Erstellung einer temporären Tabelle in SQL Server, wenn dies relevant ist.

Antwort

1

Ganz einfach:

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

Ich glaube, Sie filtern können mit dem Zustand wie folgt:

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

Das funktioniert nicht, weil die where-Klausel auf alles angewandt wird und ich nicht mehr alle Namen. –

0

Sie diesen Code

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) 
    ) 
) 
können

In Sql Sie WHERE-Klausel vor GroupByClause verwenden können, und so wird Aggregatefunction auf resltset arbeiten nach Wozu. Sie können auch die Isnull-Funktion verwenden, um den Wert 0 zurückzugeben, wenn das Ergebnis von Summe null ist. Und die zweite Auswahl gibt die Datensätze zurück, die nicht im @StartDate- und @EndDate-Bereich vorhanden sind.