Каков синтаксис T-SQL для заполнения столбцов таблицы в моей базе данных одним и тем же набором данных с непрерывными датами?

Я использую SQL Server 2016, и мне нужно создать таблицу (RoomInventory) в моей базе данных, которая будет содержать следующий набор данных, которые будут повторяться в период с 1 января 2016 года по 31 декабря 2016 года.

Вот как я хочу, чтобы финальная таблица отображалась:

Date         RoomType    Property    Inventory 
2016-01-01   SUP            JS          20
2016-01-01   DLX            JS          15
2016-01-01   FAS            FB           6

2016-01-02   SUP            JS          20
2016-01-02   DLX            JS          15
2016-01-02   FAS            FB           6
-------------------------------------------
-------------------------------------------
2016-12-31   SUP            JS           20
2016-12-31   DLX            JS           15
2016-12-31   FAS            FB            6

Я знаю, как создать таблицу и как вставить данные, используя INSERT INTO синтаксис, но я понятия не имею, как написать правильный синтаксис, который заполнит DATE столбец с необходимыми датами.

3 ответа

Решение

Используйте рекурсивный CTE:

;WITH
    cte AS
    (
        SELECT      CAST('2016-01-01' AS date)      AS [Date]
        UNION ALL
        SELECT      DATEADD(DAY, 1, [Date])
        FROM        cte
        WHERE       [Date] < '2016-12-31'
    )

SELECT      *
FROM        cte
CROSS JOIN  RoomInventory
OPTION      (MAXRECURSION 0)

Мне больше нравится опция CTE для Календаря... вот мой выбор.

DECLARE @Start DATE, @End DATE

SET @Start = '2016-01-01'
SET @End   = '2016-12-31'

IF OBJECT_ID('tempdb..#date') IS NOT NULL
    DROP TABLE #date
CREATE TABLE #date (date_id SMALLINT IDENTITY(1,1) PRIMARY KEY,
                    date_val DATE)
WHILE @Start<=@End
BEGIN
    INSERT INTO #date (date_val)
    SELECT @Start
    SET @Start=DATEADD(DD,1,@Start)
END

IF OBJECT_ID('tempdb..#roomInventory') IS NOT NULL
    DROP TABLE #roomInventory
CREATE TABLE #roomInventory (RoomType VARCHAR(5), Property VARCHAR(5), Inventory INT)
INSERT INTO #roomInventory (RoomType, Property,Inventory)
VALUES ('SUP','JS',20),
       ('DLX','JS',15),
       ('FAS','FB',6)

SELECT date_val, RoomType, Property, Inventory
FROM #date 
CROSS APPLY #roomInventory
ORDER BY date_val, RoomType

Другим вариантом является использование вашего CalendarTable и

Select B.Date,RoomType,Property,Inventory 
 From  RoomDefTable A
 Cross Join CalendarTable B
 Where B.Date between '2016-01-01' and '2016-12-31'
 Order By B.Date
Другие вопросы по тегам