2016-04-03 8 views
1

いくつかのSQLをブラッシュアップします。売上高を2005年から2008年に集計して顧客リストを作成しようとしていますが、以前の(2005-2007)の売上高はまだ2008年には売りませんでした。集計売上:過去の販売実績のある顧客を表示します。

私は2つのクエリを作成しました...どちらがより効果的かはわかりませんが、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年にSalesのないリセラーキーを選択し、これらを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

関連する問題