製品レベルで売上を表示するレポートを作成しており、各製品を販売した店舗数を含める必要があります。私の販売データは週単位で分類されていますが、日単位のサービス レベル統計も含める必要があります。
私が抱えている問題は、各製品が販売されている店舗の数を数えようとすると、最大で 7 倍になることです (サービス レベルの記録がある曜日によって異なります)。問題は、1 つのクエリ内で個別の店舗数を取得できるかどうかです。
データは次のように構成されています。
販売データ
WeekNo StoreNo ProductNo SalesValue
201301 123 123456 10,000.00
201301 123 654321 5,000.00
201301 124 123456 9,400.00
201301 124 654321 3,500.00
201302 123 123456 11,500.00
etc.
サービス レベル データ カレンダーの日付を WeekNo に変換するテーブルを介して売上に結合
Date StoreNo ProductNo ServiceLevel
01/01/2013 123 123456 99
03/01/2013 123 123456 98
04/01/2013 123 123456 100
etc.
私のSQLは次のとおりです。
select sales.ProductNo,
prod.ProductDesc,
sum(case when sales.WeekNo = 201330 then 1 end) as StoresSoldInThisWeek,
sum(case when sales.WeekNo = 201329 then 1 end) as StoresSoldInLastWeek,
sum(case when sales.WeekNo between 201324 and 201327 then 1 end) / 4 as StoresSoldInAverage,
sum(case when sales.WeekNo = 201330 then sales.SalesValue end) as SalesValueThisWeek,
sum(case when sales.WeekNo = 201329 then sales.SalesValue end) as SalesValueLastWeek,
sum(case when sales.WeekNo between 201324 and 201327 then wks.SalesValue end) / 4 as SalesValueAverage,
sum(case when sales.WeekNo = 201330 then sales.SalesVolume end) as SalesVolumeThisWeek,
sum(case when sales.WeekNo = 201329 then sales.SalesVolume end) as SalseVolumeLastWeek,
sum(case when sales.WeekNo between 201324 and 201327 then sales.SalesVolume end) / 4 as SalesVolumeAverage,
cast(sum(case when serv.WeekNo = 201330 then serv.Delivered end) as float) / nullifzero(cast(sum(case when serv.WeekNo = 201330 then serv.Ordered end) as float)) as ServiceLevelThisWeek,
cast(sum(case when serv.WeekNo = 201329 then serv.Delivered end) as float) / nullifzero(cast(sum(case when serv.WeekNo = 201329 then serv.Ordered end) as float)) as ServiceLevelLastWeek,
cast(sum(case when serv.WeekNo between 201324 and 201327 then serv.Delivered end) as float) / nullifzero(cast(sum(case when serv.WeekNo between 201324 and 201327 then serv.Ordered end) as float)) as ServiceLevelAverage
from Products prod
inner join Sales sales
on prod.ProductNo = sales.ProductNo
and sales.WeekNo in (201324,201325,201326,201327,201329,201330)
left join ServiceLevel serv
on sales.ProductNo = serv.ProductNo
and sales.StoreNo = serv.StoreNo
left join Weeks week
on serv.CalDate between week.WeekStartDate and week.WeekEndDate
and sales.WeekNo = week.WeekNo
group by 1,2
order by 1
各製品が販売されている店舗数を取得する私の試みは次のとおりです。
sum(case when sales.WeekNo = 201302 then 1 end) as StoresSoldInThisWeek,
sum(case when sales.WeekNo = 201301 then 1 end) as StoresSoldInLastWeek,
サービス レベル データを数週間にまとめてみましたが、クエリの実行に時間がかかりすぎてしまいます。質問は、個別の店舗数を取得する最も効率的な方法は何ですか? これには ROW_NUMBER() 関数が必要だと思われますが、Group By フィールドでそれを行うのは好きではないようです