2016-09-23 177 views
0

需要按月份和星期分组,基于按每月或每周首次分组的日期时间列,值需要为平均。按月份和星期分组,按日期时间列分组,按每月或每周的第一个分组

当前正在使用不给出结果的查询。请帮助我!

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, [Date]), 0), AVG(Actual), AVG(Planned) 
FROM #Table1 
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, [Date]), 0) 

样品表中的数据,并通过一个月集团预期的结果:

enter image description here

+1

哪个dmbs和您使用的是哪个版本? – Nebi

回答

0

这个问题不清楚,但在实时情况,我们提取的月平均,这里是某种形式的解决方案我做的(假设这是对MS SQL服务器):

DECLARE @YourTable Table([DateCol] DATETIME, [Actual] NUMERIC(10,2), [Planned] NUMERIC(10,2)) 

INSERT INTO @YourTable ([DateCol], [Actual], [Planned]) 
VALUES 
('01-05-2016 07:00:01',3.1,2.7), 
('01-05-2016 19:00:01',2.9,2.7), 
('03-05-2016 07:00:01',3.2,2.7), 
('03-05-2016 07:00:01',3.4,2.7), 
('05-06-2016 07:00:01',3.2,2.7), 
('07-06-2016 07:00:01',2.6,2.7), 
('07-06-2016 07:00:01',3.2,2.7) 



DECLARE @begin DATETIME, 
     @End DATETIME 

SELECT @begin = MIN([DateCol]), @End = MAX([DateCol]) 
FROM @YourTable 


-- For Monthly avg. 
SET @begin = DATEADD(MONTH, DATEDIFF(MONTH,0,@begin),0) 
SET @End = DATEADD(DAY,-1,DATEADD(MONTH, DATEDIFF(MONTH,0,@End),0)) 

--SELECT @begin,@End 

;WITH Months 
AS 
(
    SELECT @begin DateRange 
    UNION ALL 
    SELECT DATEADD(MONTH,1,DateRange) 
    FROM Months 
    WHERE DateRange < @End 
) 
SELECT m.DateRange, DATEADD(DAY,-1,DATEADD(MONTH, DATEDIFF(MONTH,0,m.DateRange)+1,0)) [DateRangeEnd],AVG([Actual]) [AvgActual],AVG([Planned]) [AvgPlanned] 
FROM @YourTable y 
     INNER JOIN Months m 
      ON y.DateCol BETWEEN m.DateRange AND DATEADD(DAY,-1,DATEADD(MONTH, DATEDIFF(MONTH,0,m.DateRange)+1,0)) 
GROUP BY m.DateRange,DATEADD(DAY,-1,DATEADD(MONTH, DATEDIFF(MONTH,0,m.DateRange)+1,0)) 

我做@Begin和@End为我的报告参数,以便用户可以取消范围。