繁体   English   中英

如何在不考虑周末的情况下将每周数据的销售额拆分为每日数据? (SSMS)

[英]How to split sales from weekly data to daily without taking weekends into account? (SSMS)

我有这个数据集:

create table ds
(
dt date,
summ int
);
insert into ds values ('26.02.2013', 312)
insert into ds values ('05.03.2013', 833)
insert into ds values ('12.03.2013', 225)
insert into ds values ('19.03.2013', 453)
insert into ds values ('26.03.2013', 774)
insert into ds values ('02.04.2013', 719)
insert into ds values ('09.04.2013', 136)
insert into ds values ('16.04.2013', 133)
insert into ds values ('23.04.2013', 157)
insert into ds values ('30.04.2013', 850)
insert into ds values ('07.05.2013', 940)
insert into ds values ('14.05.2013', 933)
insert into ds values ('21.05.2013', 422)
insert into ds values ('28.05.2013', 952)
insert into ds values ('04.06.2013', 136)
insert into ds values ('11.06.2013', 701)
;

正如标题所暗示的那样,我需要将销售额从每周数据拆分为每天。 问题是周末没有销售,所以周六和周日的每日销售数量为 0。在这种情况下,简单的 (week number/7) 实际上不起作用。 它必须是(周数/5),但我不知道如何从我的代码中排除周末。 例如,05.03.2013 - 这个特定周的 2 天是指 2 月,其中 3 天是指 3 月。 然后我需要将涉及特定月份的所有日期的所有销售额汇总为一个数字。

最终表格应包括 2 列 - 1) 每个月的总和和 2) 月份编号(在此特定示例中从 2 到 6)。

这是我的小模板,您可以在其中看到想要的结果(显然每个月的计算都不正确):

drop table if exists #subtable
declare @first_date date = (select top 1 dt from ds)                                                 
declare @mindate date = (select DATEADD(day, -6, @first_date))
declare @maxdate date = (select max(dt) from ds)

;with cte as 
    (
    select @mindate as firstdate
    from ds
    union all 
    select dateadd(day, 1, firstdate) from cte
    where firstdate < @maxdate and firstdate >= @mindate
    )
select distinct *
into #subtable
from cte 
option(maxrecursion 0)
select month(firstdate) as MonthNumber, round(sum(dailysale), 2) as overall_sales
from
    (
    select 
        d.firstdate, dailysale = ds.summ / 7
    from ds
    full join 
    #subtable d on d.firstdate <= ds.dt and d.firstdate >= DATEADD(day, -6, ds.dt)
    ) as newttt
group by month(firstdate);

我在 t-sql 中发布此尝试以澄清您的问题。 您的样本数据非常小,因此很难确定应如何处理最终聚合。 请运行它并帮助我们为您编辑。

此查询假设源表中每周有一天(它们总是星期二吗?)并且您希望对 5 个工作日的总和求平均值。

--SET DATEFORMAT dmy;

declare @ds table
(
dt date,
summ int
);
insert into @ds values ('26.02.2013', 312)
insert into @ds values ('05.03.2013', 833)
insert into @ds values ('12.03.2013', 225)
insert into @ds values ('19.03.2013', 453)
insert into @ds values ('26.03.2013', 774)
insert into @ds values ('02.04.2013', 719)
insert into @ds values ('09.04.2013', 136)
insert into @ds values ('16.04.2013', 133)
insert into @ds values ('23.04.2013', 157)
insert into @ds values ('30.04.2013', 850)
insert into @ds values ('07.05.2013', 940)
insert into @ds values ('14.05.2013', 933)
insert into @ds values ('21.05.2013', 422)
insert into @ds values ('28.05.2013', 952)
insert into @ds values ('04.06.2013', 136)
insert into @ds values ('11.06.2013', 701);

    
select  *, 
        datename(dw, s.d) as [Weekday], 
        case when datepart(dw, s.d) not in (1,7) then summ/5. else 0 end as [DailySumm] 
from @ds 
cross
apply (select dateadd(day, -n.n, dt)
        from (values(0),(1),(2),(3),(4),(5),(6))n(n)
)s(d);

这将返回每个总和一周的每一天的行,以及每个工作日的日平均值:

...
2013-02-26 312         2013-02-20 Wednesday                      62.400000
2013-03-05 833         2013-03-05 Tuesday                        166.600000
2013-03-05 833         2013-03-04 Monday                         166.600000
2013-03-05 833         2013-03-03 Sunday                         0.000000
2013-03-05 833         2013-03-02 Saturday                       0.000000
2013-03-05 833         2013-03-01 Friday                         166.600000
2013-03-05 833         2013-02-28 Thursday                       166.600000
2013-03-05 833         2013-02-27 Wednesday                      166.600000
2013-03-12 225         2013-03-12 Tuesday                        45.000000
...

希望这可以帮助您准确描述您希望如何处理每周/每月的聚合。 使用此数据集,按周或月分组应该很简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM