2016-03-21 23 views
0

Yıl = 2014 için birinci toplamı ve yıl için ikinci toplamı filtrelemenin bir yolu var mı?SQL Server: sütun başına farklı tarih filtresi

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

Süper basit görünüyor ama Where year(InvDate) = 2014 eklemek an ben satır başına her iki seneye ihtiyacı olduğunda ben, o yıl için tüm sonuçları filtreleme olduğumun farkındasınızdır.

Where year(InvDate) = 2014 OR year(InvDate) = 2015 bana 2 satır verebilir, sadece 1 satır istiyorum.

Sonuç kümesi

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

DÜZENLEME olmalıdır: hesaplamak için nasıl -/(sales_2015 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 

sales_2014 bana 0.055644 veriyor. Hesap makinesi bana 0.05892350932 veriyor. Benim sales sütun dataType değeri decimal(18,2)

EDIT2: Bölme için 2'den fazla ondalık basamak kullanmam gerekiyor.

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

cevap

3

Sen şartlı toplama ile yapabilirsiniz:

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; 

DÜZENLEME:

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

Güzel, kabul edecektir. –

+0

Hızlı soru, gerçek hedefim hesaplamaktır (sales_2015 - sales_2014)/sales_2014'. Bunu nasıl alabilirim? Bir düzenlemede denediğimi gönderiyorum. –

0

kullanabileceğiniz Yorumlarınız de cevaplamak için: yorumunda soru için

WITH kullanarak sanal tablo ve daha sonra sorgulama

Buradaki ifade:

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