SQL Server:根据某些记录将一个月内的所有天数插入到视图表中

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

我需要将表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    |    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]