2016-04-03 10 views
1

Auf einigen sql ... Ich versuche, eine Liste der Kunden mit Verkäufen pro Jahr (2005-2008) zu erstellen, wird aber nur zeigen Kunden mit Verkäufe in vorherigem (2005-2007) dennoch keine Verkäufe in 2008.Gesamtumsatz: Kunden mit früheren, aber keinen aktuellen Verkäufen zeigen

Ich habe zwei Fragen ... nicht sicher gegründet, die wirkungsvoller ist, aber irgendwie weise ich nicht scheinen, herauszufinden, wie man die Where-Klausel richtig einführt .

Jede Hilfe würde sehr geschätzt werden !!

Abfrage 1:

select r.ResellerName, 
(select sum(rs.SalesAmount) from FactResellerSales rs 
where rs.ResellerKey = r.ResellerKey 
and rs.OrderDateKey >=20050101 and rs.OrderDateKey <20060101) '2005', 

(select sum(rs.SalesAmount) from FactResellerSales rs 
where rs.ResellerKey = r.ResellerKey 
and rs.OrderDateKey >=20060101 and rs.OrderDateKey <20070101) '2006', 

(select sum(rs.SalesAmount) from FactResellerSales rs 
where rs.ResellerKey = r.ResellerKey 
and rs.OrderDateKey >=20070101 and rs.OrderDateKey <20080101) '2007', 

(select sum(rs.SalesAmount) from FactResellerSales rs 
where rs.ResellerKey = r.ResellerKey 
and rs.OrderDateKey >=20080101 and rs.OrderDateKey <20090101) '2008' 

From DimReseller r 
order by r.ResellerName ASC 

Abfrage 2:

Select r.ResellerName, 
SUM(case when OrderDateKey>=20050101 and OrderDateKey<20060101 then rs.SalesAmount else 0 end) '2005', 
SUM(case when OrderDateKey>=20060101 and OrderDateKey<20070101 then rs.SalesAmount else 0 end) '2006', 
SUM(case when OrderDateKey>=20070101 and OrderDateKey<20080101 then rs.SalesAmount else 0 end) '2007', 
SUM(case when OrderDateKey>=20080101 and OrderDateKey<20090101 then rs.SalesAmount else 0 end) '2008' 

from DimReseller r 
inner join FactResellerSales rs on rs.ResellerKey = r.ResellerKey 
Group by r.ResellerName 
Order by ResellerName ASC 

Antwort

1

Nur Abfrage 2 als eine innere Abfrage verwenden und wählen Sie, wo 2008 ist Null:

Select r.ResellerName, 
SUM(case when OrderDateKey>=20050101 and OrderDateKey<20060101 then rs.SalesAmount else 0 end) '2005', 
SUM(case when OrderDateKey>=20060101 and OrderDateKey<20070101 then rs.SalesAmount else 0 end) '2006', 
SUM(case when OrderDateKey>=20070101 and OrderDateKey<20080101 then rs.SalesAmount else 0 end) '2007', 
SUM(case when OrderDateKey>=20080101 and OrderDateKey<20090101 then rs.SalesAmount else 0 end) '2008'  
from DimReseller r 
inner join FactResellerSales rs on rs.ResellerKey = r.ResellerKey 
Group by r.ResellerName) x 
Having SUM(case when OrderDateKey>=20080101 and OrderDateKey<20090101 then rs.SalesAmount else 0 end) = 0 
Order by ResellerName ASC 

Die '2008' Spalte wird immer 0 sein würde, so Sie brauchen es nicht, oder es kann durch die Konstante 0 ersetzt werden:

select 
... 
0 as '2008' 
... 

wenn Sie möchten.

+0

'2008' = 0 wird immer falsch sein. Mit dieser Abfrage werden keine Datensätze zurückgegeben. Sie überprüfen, ob die Zeichenfolge '2008' gleich 0 ist. Wenn Sie dies tun möchten, entfernen Sie einfache Anführungszeichen. – Jeffrey

+0

Jahr, habe ich versucht 2008 = 0 und '2008' = 0 ohne Erfolg ... – user3221111

+0

Jeffrey, danke für Ihre Hilfe, nicht sicher, ob Ihre Abfrage tut, was ich wollte (ich war Reverse Engineering es) ... aber letztendlich wollte ich Kunden zeigen, die keinen Umsatz für 2008 haben, aber Verkäufe für frühere Jahre ... – user3221111

0

sollte einfach sein? Wählen Sie einfach die Reseller-Schlüssel ohne Verkäufe in 2008 in einer Unterauswahl aus und verbinden Sie diese mit FactResellerSales?

SELECT rs.* 
FROM FactResellerSales rs 
JOIN (SELECT DISTINCT r.ResellerKey 
     FROM FactResellerSales 
     WHERE OrderDateKey < 20080101) r on rs.ResellerKey = r.ResellerKey 

UPDATE

SELECT r.ResellerName, 
     sum(rs.SalesAmount) AS SalesAmount 
     YEAR(convert(date,CONVERT(varchar(10),rs.OrderDateKey,101))) AS SALES_YEAR 
FROM DimReseller r 
INNER JOIN (SELECT rs.SalesAmount, 
        rs.Resellerkey, 
        rs.OrderDateKey 
       FROM FactResellerSales rs 
       INNER JOIN (SELECT DISTINCT a.ResellerKey 
          FROM FactResellerSales 
      WHERE OrderDateKey < 20080101) a on rs.ResellerKey = a.ResellerKey) sub on r.Resellerkey = sub.Resellerkey 
GROUP BY r.ResellerName 
ORDER BY r.ResellerName ASC 
+0

Haben Sie Probleme zu verstehen, wie Sie diese Verknüpfung in meine Abfrage integrieren, müsste ich neu erstellen? Gibt es eine Chance, Hilfe beim Einfügen zu bekommen? ;) – user3221111

+0

Siehe meine aktualisierte Antwort. Habe keine Zeit zum Testen. Lassen Sie es mich wissen, wenn es funktioniert – Jeffrey

+0

Nochmals vielen Dank für Ihre Hilfe, so oder so habe ich viel über Unterabfragen durch Reverse Engineering Ihres gelernt! – user3221111

Verwandte Themen