2016-04-03 112 views
1

一些SQL刷牙......我想爲客戶創造的銷售額每年(2005- 2008年)彙總列表,但只會顯示客戶銷售在以前(2005- 2007年)還沒有銷售在2008年銷售總額:與以往的顯示客戶,但沒有目前的銷售

我已經建立了兩個查詢...不知道哪個更有效,但無論哪種方式,我似乎無法弄清楚如何正確地執行where子句。

任何幫助將不勝感激!

查詢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 

查詢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 

回答

1

只需使用查詢2作爲內查詢,並選擇其中2008是零:

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 

的 '2008' 的列總是爲0,所以你不需要它,或者它可以隨着不斷0替代:

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

如果你想。

+0

'2008'= 0將始終爲假。沒有記錄將返回此查詢。你正在檢查字符串'2008'是否等於0.如果你想這樣做刪除單引號。 – Jeffrey

+0

年,我試過2008 = 0和'2008'= 0無效... – user3221111

+0

傑弗裏,感謝您的幫助,不確定您的查詢是否正在做我想做的事(我是逆向工程)...但最終想要顯示的客戶,2008年沒有銷售,但銷售前幾年...... – user3221111

0

應該很容易?只需在子選擇中選擇2008年沒有銷售的轉銷商,並將它們加入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

無法理解如何將該連接集成到我的查詢中,我需要重建嗎?有機會獲得幫助插入它? ;) – user3221111

+0

看到我更新的答案。不必時間去測試。讓我知道它是否工作 – Jeffrey

+0

再次感謝您的幫助,無論哪種方式,我通過逆向工程學到了很多關於子查詢的知識! – user3221111