2016-12-28 2 views
0

Ich berechne historischen Betrag aus einer Tabelle in Jahren (ex. 2015-2016, 2014-2015, etc.) Ich möchte Know-how suchen, wenn es effizienter ist, es zu tun einen Stapel oder wiederholen Sie die Abfrage mehrmals nach dem erforderlichen Datum gefiltert.SQL-Effizienz auf Datumsbereich oder separate Tabellen

Vielen Dank im Voraus!

OPTION 1:

select 
    id, 
    sum(case when year(getdate()) - year(txndate) between 5 and 6 then amt else 0 end) as amt_6_5, 
    ... 
    sum(case when year(getdate()) - year(txndate) between 0 and 1 then amt else 0 end) as amt_1_0, 
from 
    mytable 
group by 
    id 

OPTION 2:

select 
    id, sum(amt) as amt_6_5 
from 
    mytable 
group by 
    id 
where 
    year(getdate()) - year(txndate) between 5 and 6 

... 

select 
    id, sum(amt) as amt_1_0 
from 
    mytable 
group by 
    id 
where 
    year(getdate()) - year(txndate) between 0 and 1 
+4

Nun, Sie könnten einfach beide Versionen ausprobieren und für sich selbst sehen ... Ich wette auf Version 1. –

Antwort

0

Diese Hilfe, die Sie sein können,

WITH CTE 
AS 
(
    SELECT id, 
      (CASE WHEN year(getdate()) - year(txndate) BETWEEN 5 AND 6 THEN 'year_5-6' 
        WHEN year(getdate()) - year(txndate) BETWEEN 4 AND 5 THEN 'year_4-5' 
        ... 
        END) AS my_year, 
      amt 
    FROM mytable 
) 
SELECT id,my_year,sum(amt) 
FROM CTE 
GROUP BY id,my_year 

Hier im Inneren des CTE, nur eine richtige year_tag für jede zugewiesene Datensätze (basierend auf Ihren Bedingungen), danach wählen Sie eine Zusammenfassung für das CTE gruppiert von diesem Jahr_tag.

1

1. Wenn Sie keine Ressourcenprobleme haben, würde ich mit der CASE-Version gehen.
Obwohl dies keine Auswirkungen auf die Ergebnisse hat, kann das Filtern des angeforderten Zeitraums in der WHERE-Klausel einen erheblichen Leistungsvorteil haben.
2. Ihre Periodendefinition erzeugt Überschneidungen.

select id 
     ,sum(case when year(getdate()) - year(txndate) = 6 then amt else 0 end) as amt_6 
     -- ... 
     ,sum(case when year(getdate()) - year(txndate) = 0 then amt else 0 end) as amt_0 
where  txndate >= dateadd(year, datediff(year,0, getDate())-6, 0) 
from  mytable 
group by id 
Verwandte Themen