SQL:如何对每月某个日期的日期进行分组

时间:2016-11-24 10:07:09

标签: sql sql-server

我需要将销售日期从特定日期开始分组。日期由销售数据的日期确定。在下面的示例中,数据将在2016/11/10导出。

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

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

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

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

-- 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

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