2016-03-21 14 views
0

Gibt es eine Möglichkeit, die erste Summe für Jahr = 2014 und die zweite Summe für Jahr = 2015 zu filtern?SQL Server: Unterschiedliches Datumsfilter pro Spalte

Select productName, sum(sales), sum(sales) 
From Invoices 
Where productName = ? 

Es scheint, super einfach, aber der Moment, als ich Where year(InvDate) = 2014 hinzufügen Ich weiß, ich bin Filterung alle Ergebnisse für dieses Jahr, wenn ich pro Zeile beiden Jahre benötigen.

Doing Where year(InvDate) = 2014 OR year(InvDate) = 2015 würde mir 2 Zeilen geben, ich möchte nur 1 Zeile.

Ergebnis Satz

ProductName | sum of 2014 sales for this product | sum of 2015 sales for this product 

EDIT sein sollte: Wie berechnen (sales_2015 - sales_2014)/sales_2014

SELECT vendorpn, (sum(case when year(InvDate) = 2015 then sales else 0 end) - sum(case when year(InvDate) = 2014 then sales else 0 end))/ 
       sum(case when year(InvDate) = 2015 then sales else 0 end) 
     from BG_Invoice a inner join BG_Parts b on a.material = b.material 
     where customer = 10011484 and vendorpn = 'LM321-118V' 
     group by vendorpn 
     having sum(sales) > 0 

ist mir 0,055644 geben. Rechner gibt mir 0.05892350932. Meine sales Spalte dataType ist decimal(18,2)

EDIT2: Sieht so aus, als müsste ich mehr als 2 Dezimalstellen für die Division verwenden.

(CONVERT(DECIMAL(18,8),sum(case when year(InvDate) = 2015 then sales else 0 end)) 

Antwort

3

Sie können dies mit bedingter Aggregation:

Select productName, 
     sum(case when year(InvDate) = 2014 then sales else 0 end) as sales_2014, 
     sum(case when year(InvDate) = 2015 then sales else 0 end) as sales_2015 
from Invoices 
group by productName; 

EDIT:

Für die Frage im Kommentar:

Select productName, 
     (sum(case when year(InvDate) = 2015 then sales else - sales end)/
     sum(case when year(InvDate) = 2014 then sales end) 
     ) as ratio 
from Invoices 
where year(InvDate) in (2014, 2015) 
group by productName; 
+0

Schön, wird akzeptiert. –

+0

Schnelle Frage, mein wirkliches Ziel ist es, '(sales_2015 - sales_2014)/sales_2014' zu berechnen. Wie würde ich das bekommen? Veröffentlichen, was ich in einer Bearbeitung versucht habe. –

0

an Ihrem Kommentar beantworten können Sie verwenden die virtuelle Tabelle mit WITH und dann Abfrage

Hier ist die Aussage:

WITH CTE as (
Select productName, 
     sum(case when year(InvDate) = 2014 then sales else 0 end) as sales_2014, 
     sum(case when year(InvDate) = 2015 then sales else 0 end) as sales_2015 
from Invoices 
group by productName; 
) 
SELECT productName, ((sales_2014 - sales_2015)/sales_2014) as result 
FROM CTE