同比月销售额
Year over year monthly sales
我正在使用 SQL Server 2008 R2。这是我的查询 returns 每个商店按邮政编码的每月销售总额。
select
left(a.Zip, 5) as ZipCode,
s.Store,
datename(month,s.MovementDate) as TheMonth,
datepart(year,s.MovementDate) as TheYear,
datepart(mm,s.MovementDate) as MonthNum,
sum(s.Dollars) as Sales,
count(*) as [TxnCount],
count(distinct s.AccountNumber) as NumOfAccounts
from
dbo.DailySales s
inner join
dbo.Accounts a on a.AccountNumber = s.AccountNumber
where
s.SaleType = 3
and s.MovementDate > '1/1/2016'
and isnull(a.Zip, '') <> ''
group by
left(a.Zip, 5),
s.Store,
datename(month, s.MovementDate),
datepart(year, s.MovementDate),
datepart(mm, s.MovementDate)
现在我想添加列,将每个邮政编码和商店的销售额、TxnCount 和 NumOfAccounts 与上一年的同一个月进行比较。我还希望每个 zip code/store 组合在 运行ge 中每个月都有一个记录;所以如果为空则为零。
我确实有一个日历 table,我试图用它来获取所有月份,但由于我的 "where" 语句,我 运行 遇到了问题。
我知道这两个问题(与前一年相比,包括日期 运行ge 中的所有日期)之前都已经被询问和回答过,我已经让他们先于我工作,但是这个特别的让我 运行 圈子里。任何帮助将不胜感激。
我希望这已经足够清楚了。
谢谢,
蒂姆
将上面的查询视为数据源。 运行 它作为您要报告的时间段的 CTE,加上时间段 - 12 个月(以获取历史数据)。 (每月销售额)
然后执行一个查询,从您的日历 table 中获取您需要的所有月份作为另一个 CTE。这是报告月份,而不是上一年。 (MonthsToReport)
获取每个有效邮政编码/商店组合的列表 - 可能 select 与 SalesPerMonth CTE 不同,这将只为您提供在该时期(或历史时期)至少有一次销售的组合 - 您可能还想要去年售出但今年售出的)。另一个 CTE - StoreZip
最后,您的主查询将 StoreZip 结果与 MonthsToReport 交叉连接 - 这为您提供了每 StoreZip/Month 个组合的一行。左联接两次到 SalesPerMonth 数据,一次用于月份,一次用于 1 年前的数据。使用 ISNULL 将任何空记录(无数据)更改为零。
除了 CTE,您还可以将其作为单独的查询来执行,将结果存储在 Temp tables 中。这可能更适用于大量数据。
我正在使用 SQL Server 2008 R2。这是我的查询 returns 每个商店按邮政编码的每月销售总额。
select
left(a.Zip, 5) as ZipCode,
s.Store,
datename(month,s.MovementDate) as TheMonth,
datepart(year,s.MovementDate) as TheYear,
datepart(mm,s.MovementDate) as MonthNum,
sum(s.Dollars) as Sales,
count(*) as [TxnCount],
count(distinct s.AccountNumber) as NumOfAccounts
from
dbo.DailySales s
inner join
dbo.Accounts a on a.AccountNumber = s.AccountNumber
where
s.SaleType = 3
and s.MovementDate > '1/1/2016'
and isnull(a.Zip, '') <> ''
group by
left(a.Zip, 5),
s.Store,
datename(month, s.MovementDate),
datepart(year, s.MovementDate),
datepart(mm, s.MovementDate)
现在我想添加列,将每个邮政编码和商店的销售额、TxnCount 和 NumOfAccounts 与上一年的同一个月进行比较。我还希望每个 zip code/store 组合在 运行ge 中每个月都有一个记录;所以如果为空则为零。
我确实有一个日历 table,我试图用它来获取所有月份,但由于我的 "where" 语句,我 运行 遇到了问题。
我知道这两个问题(与前一年相比,包括日期 运行ge 中的所有日期)之前都已经被询问和回答过,我已经让他们先于我工作,但是这个特别的让我 运行 圈子里。任何帮助将不胜感激。
我希望这已经足够清楚了。
谢谢, 蒂姆
将上面的查询视为数据源。 运行 它作为您要报告的时间段的 CTE,加上时间段 - 12 个月(以获取历史数据)。 (每月销售额)
然后执行一个查询,从您的日历 table 中获取您需要的所有月份作为另一个 CTE。这是报告月份,而不是上一年。 (MonthsToReport)
获取每个有效邮政编码/商店组合的列表 - 可能 select 与 SalesPerMonth CTE 不同,这将只为您提供在该时期(或历史时期)至少有一次销售的组合 - 您可能还想要去年售出但今年售出的)。另一个 CTE - StoreZip
最后,您的主查询将 StoreZip 结果与 MonthsToReport 交叉连接 - 这为您提供了每 StoreZip/Month 个组合的一行。左联接两次到 SalesPerMonth 数据,一次用于月份,一次用于 1 年前的数据。使用 ISNULL 将任何空记录(无数据)更改为零。
除了 CTE,您还可以将其作为单独的查询来执行,将结果存储在 Temp tables 中。这可能更适用于大量数据。