首页 > 解决方案 > 按周和周分组从星期二开始

问题描述

这是我的数据表:

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

请注意,表格组织得不好。

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

我怎样才能按周从星期二开始这个小组?

标签: mysqlsqlgroup-bytimestamp-with-timezone

解决方案


我在 SqlFiddle 上创建了一个示例

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

MySQL 似乎将 SUNDAY 作为一周的默认开始。因此,为了有星期二,我将采用任何交易日期并将其向后移动 2 天(星期二 -1 = 星期一 - 1 = 星期日)。所以现在“WEEK”函数将返回一年中的第几周。您可以从第一个查询中看到结果,该查询区分原始日期和它对 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

推荐阅读