首页 > 解决方案 > 按星期的开始和结束日期分组

问题描述

我有以下促销日期:

Group: Ambient
Start Date: 03/11/2020   End Date: 09/11/2020
Start Date: 10/11/2020   End Date: 16/11/2020

Group: Chilled
Start Date: 04/11/2020   End Date: 10/11/2020
Start Date: 11/11/2020   End Date: 17/11/2020
etc 

我的数据由以下列组成:日期(每日)、组(环境/冷藏)、净销售额、销量

我想将数据分组如下:

Weekly Date, Group, Net Sales, Volume Sold

每周日期 我希望一周从周二开始,并根据组的类型在周一结束。如果产品冷藏,我希望一周从周三开始,到周二结束。我想这样做并包含一个历史视图以将前几周与促销周进行比较示例

        Week Date     Group      Net Sales    Volume
Row 1 - 27/10/2020    Ambient    £900         30
Row 2 - 03/11/2020    Ambient    £1000        50

Row 3 - 04/11/2020    Chilled    £2000        40
Row 4 - 11/11/2020    Chilled    £1000        30

更改星期日期的 SQL 查询是什么?

标签: sqldatedatetimegroup-by

解决方案


可能有其他方法可以做到这一点,但我会首先创建一些函数返回我想要的 DOW(星期几)(周二 0,... 周一 6),然后创建另一个函数 FDOW(第一天周)使用 DOW。IE:

-- Tuesday = 0...Monday = 6
CREATE FUNCTION [dbo].[DOW]
(
    @date DATETIME
)
RETURNS INT
AS
BEGIN
    -- Add the T-SQL statements to compute the return value here
    RETURN (@@DATEFIRST + DATEPART(dw, @date) - 1 - 2) % 7;
END;

CREATE FUNCTION [dbo].[FDOW]
(
    @date DATETIME
)
RETURNS DATETIME
AS
BEGIN
    RETURN DATEADD(d, -dbo.DOW(@date), CAST(@date AS DATE));
END;

拥有这样的功能很容易在“WeekStart”上进行分组,这是我们的 FDOW 功能:

Select dbo.FDOW(Dates) as WeekOf, [Group], 
   sum([Net Sales]) [Net Sales],
   sum([Volume Sold]) [Volume]
from myTable
group by dbo.FDOW(Dates) as WeekOf, [Group];

推荐阅读