【发布时间】:2018-03-04 21:39:07
【问题描述】:
我在一个带日期的表中有数据,并且想按“周”(例如“2017-05-01 周”)计算行数,其中结果具有周的日期(从星期一开始)和匹配行数——即使那周没有行。 (这都将在一个日期范围内。)
我可以通过在DATEPART(wk, D)(其中D 是日期列)上分组来轻松地将事情划分为几周,但我正在努力解决:
如何获取“星期”日期并填写,以及
如何在数据中没有匹配行的情况下连续一周
这里按周分组:
SET DATEFORMAT ymd;
SET DATEFIRST 1; -- Monday is first day of week
DECLARE @startDate DATETIME = '2017-05-01';
DECLARE @endDate DATETIME = '2017-07-01';
SELECT DATEPART(wk, D) AS [Week Number], COUNT(*) AS [Count]
FROM #temp
GROUP BY DATEPART(wk, D)
ORDER BY DATEPART(wk, D);
这给了我:
+−−−−−−−−−−−−−−+−−−−−−−−−+ |周数 |计数 | +−−−−−−−−−−−−−−+−−−−−−−−−+ | 19 | 5 | | 20 | 19 | | 22 | 8 | | 23 | 10 | | 24 | 5 | | 26 | 4 | +−−−−−−−−−−−−−−+−−−−−−−−−+但理想情况下我想要:
+−−−−−−−−−−−−−+−−−−−−−−+ |周 |计数 | +−−−−−−−−−−−−−+−−−−−−−−+ | 2017-05-01 | 5 | | 2017-05-08 | 19 | | 2017-05-15 | 0 | | 2017-05-22 | 8 | | 2017-05-29 | 10 | | 2017-06-05 | 5 | | 2017-06-12 | 0 | | 2017-06-19 | 4 | | 2017-06-26 | 0 | +−−−−−−−−−−−−−+−−−−−−−−+我该怎么做?
设置测试信息:
SET DATEFIRST 1;
SET DATEFORMAT ymd;
CREATE TABLE #temp (
D DATETIME
);
GO
INSERT INTO #temp (D)
VALUES -- Week of 2017-05-01 (#19)
('2017-05-01'),('2017-05-01'),('2017-05-01'),
('2017-05-06'),('2017-05-06'),
-- Week of 2017-05-08 (#20) - note no data actually on the 8th
('2017-05-10'),
('2017-05-11'),('2017-05-11'),('2017-05-11'),('2017-05-11'),('2017-05-11'),('2017-05-11'),
('2017-05-12'),('2017-05-12'),('2017-05-12'),('2017-05-12'),
('2017-05-13'),('2017-05-13'),('2017-05-13'),('2017-05-13'),('2017-05-13'),('2017-05-13'),('2017-05-13'),
('2017-05-14'),
-- Week of 2017-05-15 (#21)
-- (note we have no data for this week)
-- Week of 2017-05-22 (#22)
('2017-05-22'),('2017-05-22'),('2017-05-22'),
('2017-05-23'),('2017-05-23'),('2017-05-23'),('2017-05-23'),('2017-05-23'),
-- Week of 2017-05-29 (#23)
('2017-05-29'),('2017-05-29'),('2017-05-29'),
('2017-06-02'),('2017-06-02'),
('2017-06-03'),
('2017-06-04'),('2017-06-04'),('2017-06-04'),('2017-06-04'),
-- Week of 2017-06-05 (#24) - note no data actually on the 5th
('2017-06-08'),('2017-06-08'),('2017-06-08'),
('2017-06-11'),('2017-06-11'),
-- Week of 2017-06-12 (#25)
-- (note we have no data for this week)
-- Week of 2017-06-19 (#26)
('2017-06-19'),('2017-06-19'),('2017-06-19'),
('2017-06-20');
GO
【问题讨论】:
标签: sql-server tsql