繁体   English   中英

SQL:如何从每个月的特定日期开始对日期进行分组

[英]SQL:How to group the dates from a certain date of each month

我需要对从某个日期开始的销售日期进行分组。 该日期由导出销售数据的日期确定。 在以下示例中,数据是在2016/11/10导出的。

然后应将销售日期分组到黄色列中,以计算每个期间的销售额。

我尝试了dateadd函数,但是由于每个月的日期可能不同,所以它不起作用。

任何建议将不胜感激。 谢谢。

在此处输入图片说明

挑战的关键是找到可以分组的东西。 由于在数据中不存在,因此需要创建它。 我的基本想法是抵消日期。 当前月份之后的日期将推入下个月。 这给了我们一个报告月份,我们可以对其进行分组。

我的查询使用以下示例数据:

-- Generates a sample table.
-- Contains one record per day, between Dec 1st 2015 and Feb 29th 2016.
DECLARE @BaseDate DATE = '2015-12-01';
DECLARE @Sample TABLE
    (
        DateKey DATE
    )
;

WHILE @BaseDate < '2016-02-29'
BEGIN

    INSERT INTO @Sample
        (
            DateKey
        )
    VALUES
        (@BaseDate)
    ;

    SET @BaseDate = DATEADD(DAY, 1, @BaseDate);
END

这里是:

-- Offsets the date into reporting month groups.
SELECT
    DateKey,
    CASE        
        WHEN DAY(DateKey) > DAY(GETDATE())THEN 
            CASE MONTH(DateKey) WHEN 12 THEN DATEFROMPARTS(YEAR(DateKey) + 1, 1, 1)
            ELSE DATEFROMPARTS(YEAR(DateKey), MONTH(DateKey) + 1, 1)
        END             
        ELSE DATEFROMPARTS(YEAR(DateKey), MONTH(DateKey), 1)
    END AS ReportingMonth
FROM    
    @Sample
WHERE
    DateKey BETWEEN '2015-12-01' AND '2016-04-30'
ORDER BY 
    DateKey DESC
;

如果您在一个月的24日运行此程序,结果将如下所示:

DateKey     ReportingMonth
2016-02-28  2016-03-01
2016-02-28  2016-03-01
2016-02-27  2016-03-01
2016-02-26  2016-03-01
2016-02-25  2016-03-01
2016-02-24  2016-02-01    -- Reporting period changes here.
2016-02-23  2016-02-01
2016-02-22  2016-02-01
...
2015-12-03  2015-12-01
2015-12-02  2015-12-01
2015-12-01  2015-12-01

老实说,我对此查询不满意。 我相信可以改进和简化它。 但希望它为您提供了一个良好的起点。

暂无
暂无

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

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