SQL server 对日期每三天进行分组

有一个表,并不是每一个日期在里面都有对应的值,但是要根据日期对每三天的一个值进行求和,如果有一天在表里没有记录,则值当作0处理,问题的关键是怎么对日期进行每三天分组,并且... 有一个表,并不是每一个日期在里面都有对应的值,但是要根据日期对每三天的一个值进行求和,如果有一天在表里没有记录,则值当作0处理,问题的关键是怎么对日期进行每三天分组,并且即便那一天在表里没有记录…………求解 展开
 我来答
SQL的艺术
2018-06-02 · SQL写多了就会在追求极致
SQL的艺术
采纳数:2040 获赞数:3324

向TA提问 私信TA
展开全部

1、首先需要一个能生成日期范围的表值函数

/*
生成一个日期范围,如2014.01、2014.02...
@Increment 步进值
@StartDate 开始日期
@EndDate   结束日期
----------------------
@SelectedRange 返回值名称(多语句表值函数的返回值必须存放在返回值变量中)
    返回表的字段和类型:
    iDate DATETIME,
    iYear char(4),
    iMonth char(2),
    iYM CHAR(7)
*/

CREATE FUNCTION [dbo].[DateRange]
(
    @Increment char(1) = 'm',
    @StartDate    DATE='20140101',
    @EndDate    DATE=null
)

RETURNS @SelectedRange TABLE
(
    iDate DATE,
    iYear char(4),
    iMonth char(2),
    iYM CHAR(7)
)
AS
BEGIN
/*Default value for stored procedures parameter have to be constants. 
The function GETDATE() returns a different value from time to time, so it is not a constant expression.
*/
--IF @EndDate is null
--SET @EndDate = getdate()
--or
SET @EndDate=Coalesce(@EndDate,GetDate())
        ;WITH cteRange(DateRange) AS
        (
            SELECT CAST(@StartDate AS DATE)
            UNION ALL
            SELECT 
                  CASE
                        WHEN @Increment = 'd' THEN DATEADD(dd, 1, DateRange)
                        WHEN @Increment = 'w' THEN DATEADD(ww, 1, DateRange)
                        WHEN @Increment = 'm' THEN DATEADD(mm, 1, DateRange)
                  END
            FROM cteRange
            WHERE DateRange <= 
                  CASE
                        WHEN @Increment = 'd' THEN DATEADD(dd, -1, @EndDate)
                        WHEN @Increment = 'w' THEN DATEADD(ww, -1, @EndDate)
                        WHEN @Increment = 'm' THEN DATEADD(mm, -1, @EndDate)
                  END
        )
        INSERT INTO @SelectedRange(iDate,iYear,iMonth,iYM)
        SELECT DateRange, YEAR(DateRange) [Year], MONTH(DateRange) [Month] ,CONVERT(VARCHAR(7),DateRange,102)[YM]
        FROM cteRange
        OPTION (MAXRECURSION 0);
        RETURN
END

2、使用示例:

SELECT * FROM DateRange('d','2018-01-01','2018-06-01')

3、生成每隔3天的日期段

select 
min(iMD)+'-'+max(iMD) as 时间段
,min(iDate) min_Date,max(iDate) max_Date 
from [dbo].[DateRange]('d','2018-01-01','2018-06-01') 
group by (id-1)/3

4、使用上面的查询去关联带值的表,然后进行SUM即可实现

子头宇0e
2018-06-02 · 超过21用户采纳过TA的回答
知道答主
回答量:122
采纳率:37%
帮助的人:26.2万
展开全部
谁提过的进
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式