SQL Server:根据某些记录将一个月内的所有天数插入到视图表中
我需要将表a中一个月内的所有日期插入到基于某些记录的视图中 情景如下: 表A: 查看预期结果:此视图需要包含1月1日至31日的所有日期。这些空列应为NULLSQL Server:根据某些记录将一个月内的所有天数插入到视图表中,sql,sql-server,database,Sql,Sql Server,Database,我需要将表a中一个月内的所有日期插入到基于某些记录的视图中 情景如下: 表A: 查看预期结果:此视图需要包含1月1日至31日的所有日期。这些空列应为NULL Date | Scan_In | Scan_Out ------------+-----------+----------- 1/1/2018 | Null | Null 2/1/2018 | Null | Null 3/1/2018 | Yes |
Date | Scan_In | Scan_Out
------------+-----------+-----------
1/1/2018 | Null | Null
2/1/2018 | Null | Null
3/1/2018 | Yes | Yes
4/1/2018 | No | Yes
5/1/2018 | Null | Null
6/1/2018 | Null | Null
7/1/2018 | Yes | No
8/1/2018 | Null | Null
9/1/2018 | Null | Null
10/1/2018 | Null | Null
11/1/2018 | Null | Null
12/1/2018 | Null | Null
持续到该月的结束日期。对于3xSample,2018年1月31日是1月的结束日。递归CTE适用于以下情况:
with dates as (
select cast('2018-01-01' as date) as dte
union all
select dateadd(day, 1, dte)
from dates
where dte < '2018-01-31'
)
select d.dte, a.scan_in, a.scan_out
from dates d left join
a
on d.dte = a.date
order by d.dte;
样本数据
DECLARE @TempData AS TABLE ([Date] DATE, Scan_In VARCHAR(5),Scan_Out VARCHAR(5))
INSERT INTO @TempData
SELECT '2018-01-03' ,'Yes','Yes' UNION ALL
SELECT '2018-01-04' ,'No' ,'Yes' UNION ALL
SELECT '2018-01-07' ,'Yes','No'
SELECT * FROM @TempData
Sql脚本
DECLARE @GiveDate DATE,
@EndDate DATE,
@MOnth INT,
@YEAR INT
SELECT @MOnth=MONTH([Date]),@YEAR=YEAR([Date]) FROM @TempData
SET @GiveDate=CAST(CAST(@year AS varchar(4)) + '-' + CAST(@month AS varchar(2)) + '-' + '1' AS DATE);
SELECT @EndDate=EOMONTH(@GiveDate)
;WITH CTE
AS
(
SELECT DISTINCT Number,DATEADD(DAY,Number,@GiveDate) AS ReqDays
FROM master.dbo.spt_values WHERE Number BETWEEN 0 AND 100
AND DATEADD(DAY,Number,@GiveDate) BETWEEN @GiveDate AND @EndDate
)
SELECT c.ReqDays,
t.Scan_In,
t.Scan_Out
FROM CTE c LEFT JOIN @TempData t
ON c.ReqDays=t.[Date]
解决方案演示:使用日期表,左键连接到表a。
DECLARE @GiveDate DATE,
@EndDate DATE,
@MOnth INT,
@YEAR INT
SELECT @MOnth=MONTH([Date]),@YEAR=YEAR([Date]) FROM @TempData
SET @GiveDate=CAST(CAST(@year AS varchar(4)) + '-' + CAST(@month AS varchar(2)) + '-' + '1' AS DATE);
SELECT @EndDate=EOMONTH(@GiveDate)
;WITH CTE
AS
(
SELECT DISTINCT Number,DATEADD(DAY,Number,@GiveDate) AS ReqDays
FROM master.dbo.spt_values WHERE Number BETWEEN 0 AND 100
AND DATEADD(DAY,Number,@GiveDate) BETWEEN @GiveDate AND @EndDate
)
SELECT c.ReqDays,
t.Scan_In,
t.Scan_Out
FROM CTE c LEFT JOIN @TempData t
ON c.ReqDays=t.[Date]