Group By week and week 从星期二开始

Group By week and week starts from Tuesday

这是我的数据table:

invoice_id  invoice_line    store_id    time_stamp  product units   sales   cogs
10000001    31215           3           9/3/17      3000    1       99.99   58.00
10000001    31216           3           9/3/17      3354H   3       32.99   18.00
10000002    91455           1           9/5/17      1234    2       24.99   20.00
10000003    59943           2           9/5/17      3000    1       19.99   14.99
10000004    95027           2           9/5/17      18518   1       9.99    3.00
10000005    73994           2           9/5/17      12HA12  15      3.99    1.99
10000006    98464           1           10/1/17     wh30000 1       199.99  75.00

请注意 table 组织得不好。

我需要按周数、商店编号汇总总销售额、总销售量和总利润(可以计算为总销售额减去 cogs)。

一周从星期二开始,如何按周分组?

I created a sample out on SqlFiddle

为了帮助您从星期二开始对 Week() 进行采样,我在您提供的示例数据末尾添加了大约 11 行,但给出的日期是 2020 年 2 月 1 日到 2020 年 2 月 11 日。

MySQL 似乎将星期日作为一周的默认开始。因此,为了有星期二,我将采用任何交易日期并将其向后移动 2 天(星期二 -1 = 星期一 - 1 = 星期日)。所以现在 "WEEK" 函数将 return 一年中的第几周。您可以从第一个查询中看到结果,该查询区分了原始日期及其对 WEEK() 的日期感知,然后再次进行 -2 转换以查看基于星期二的星期变化。

select
        week( SI.Time_Stamp ) DefWeek,
        dayName( SI.Time_Stamp ) DefWeekName,
        week( date_add( SI.Time_Stamp, interval -2 day )) TuesWeek,
        dayName( date_add( SI.Time_Stamp, interval -2 day )) TuesWeekName,
        SI.*
    from
        StackInvoice SI
    order by
        SI.Time_Stamp;

现在您可以看到如何应用转换,现在它是一个简单的聚合。

select
        week( date_add( SI.Time_Stamp, interval -2 day )) TuesWeek,
        SI.Store_ID,
        sum( SI.Sales ) TotalSales,
        sum( SI.Units ) TotalUnits,
        sum( SI.Sales - SI.Cogs ) TotalProfit
    from
        StackInvoice SI
    group by
        week( date_add( SI.Time_Stamp, interval -2 day )),
        SI.Store_ID
    order by
        week( date_add( SI.Time_Stamp, interval -2 day )),
        SI.Store_ID