SQL Server: вставлять все дни месяца в таблицу представлений на основе некоторых записей - PullRequest
0 голосов
/ 04 июня 2018

Мне нужно вставить все даты за месяц из таблицы A в представление, основанное на некоторых записях.

Сценарий, как показано ниже:

Таблица A :

   Date     | Scan_In   | Scan_Out
------------+-----------+------------
  3/1/2018  |    Yes    |    Yes    
  4/1/2018  |    No     |    Yes    
  7/1/2018  |    Yes    |    No     

Представление (ожидаемый результат): в этом представлении должны быть все даты в январес 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   

продолжаться до даты окончания месяца.Для 3xample 31/1/2018 является днем ​​окончания января.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Пример данных

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 SCript

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]

Демонстрационное решение: http://rextester.com/TNGU27548

0 голосов
/ 04 июня 2018

Рекурсивный 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...