1

製品レベルで売上を表示するレポートを作成しており、各製品を販売した店舗数を含める必要があります。私の販売データは週単位で分類されていますが、日単位のサービス レベル統計も含める必要があります。

私が抱えている問題は、各製品が販売されている店舗の数を数えようとすると、最大で 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 フィールドでそれを行うのは好きではないようです

4

1 に答える 1