Sql server 对于本例,如何在SQL SERVER中添加空行?

Sql server 对于本例,如何在SQL SERVER中添加空行?,sql-server,sql-server-2012,days,Sql Server,Sql Server 2012,Days,我有以下表格结构: CREATE TABLE Schedule ([Day] varchar(13), [Starts] varchar(57), [Ends] varchar(57)) ; INSERT INTO Schedule ([Day], [Starts], [Ends]) VALUES ('2', '09:00', '15:00'), ('5', '10:00', '12:00'), ('3', '09:00', '18:00') ; 下

我有以下表格结构:

    CREATE TABLE Schedule
    ([Day] varchar(13), [Starts] varchar(57), [Ends] varchar(57))
;

INSERT INTO Schedule
    ([Day], [Starts], [Ends])
VALUES
    ('2', '09:00', '15:00'),
   ('5', '10:00', '12:00'),
  ('3', '09:00', '18:00')
;
下面是显示当前行的简单查询:

   SELECT
 DATENAME(weekday,  Day - 1) as days,
  Starts,
  Ends  
FROM
  Schedule
  order by Day
最后一个查询将获得以下结果:

Day        Starts    Ends
---        -------   ----
Tuesday    09:00     15:00
Wednesday  09:00     18:00
Friday     10:00     12:00
我想把登记册上没有的日期填在表格里

这是我想要得到的最终结果:

    Day        Starts    Ends
    ---        -------   ----
    Monday     NULL      NULL
    Tuesday    09:00     15:00
    Wednesday  09:00     18:00
    Thursday   NULL      NULL
    Friday     10:00     12:00

我怎样才能得到这个?谢谢,我将创建一个empy基表并进行左联接:

CREATE TABLE Schedule
(Day VARCHAR(13), Starts VARCHAR(57), Ends   VARCHAR(57));

INSERT INTO Schedule (Day, Starts,Ends)

VALUES
('2', '09:00','15:00'),
('5', '10:00','12:00'),
('3', '09:00','18:00');


CREATE TABLE ScheduleBase
(Day    VARCHAR(13), Starts VARCHAR(57), Ends VARCHAR(57));


INSERT INTO ScheduleBase
(Day, Starts, Ends)
VALUES
('1', NULL, NULL),
('2', NULL, NULL),
('3', NULL, NULL),
('4', NULL, NULL),
('5', NULL, NULL)

SELECT SB.Day, S.Starts, S.Ends FROM ScheduleBase AS SB LEFT JOIN Schedule 
AS S ON SB.Day = S.Day

我将创建一个empy基表并执行左联接:

CREATE TABLE Schedule
(Day VARCHAR(13), Starts VARCHAR(57), Ends   VARCHAR(57));

INSERT INTO Schedule (Day, Starts,Ends)

VALUES
('2', '09:00','15:00'),
('5', '10:00','12:00'),
('3', '09:00','18:00');


CREATE TABLE ScheduleBase
(Day    VARCHAR(13), Starts VARCHAR(57), Ends VARCHAR(57));


INSERT INTO ScheduleBase
(Day, Starts, Ends)
VALUES
('1', NULL, NULL),
('2', NULL, NULL),
('3', NULL, NULL),
('4', NULL, NULL),
('5', NULL, NULL)

SELECT SB.Day, S.Starts, S.Ends FROM ScheduleBase AS SB LEFT JOIN Schedule 
AS S ON SB.Day = S.Day

如果不想创建新表,可以使用此选项

select
    DATENAME(weekday,  Day - 1) as days, max(Starts), max(Ends)
from (
    SELECT
        Day, Starts, Ends  
    FROM
        Schedule
    union all 
    select 
        *, null, null 
    from (values (1),(2),(3),(4),(5),(6),(7)) t(d)
) t
group by Day

如果不想创建新表,可以使用此选项

select
    DATENAME(weekday,  Day - 1) as days, max(Starts), max(Ends)
from (
    SELECT
        Day, Starts, Ends  
    FROM
        Schedule
    union all 
    select 
        *, null, null 
    from (values (1),(2),(3),(4),(5),(6),(7)) t(d)
) t
group by Day

您可以使用公共表expressin动态生成周日历表:

with range (num) as (
  select 1 union all select 2 union all select 3
  union all select 4 union all select 5 union all select 6
  union all select 7
 )
SELECT
 DATENAME(weekday,  range.num - 1),
  Starts,
  Ends  
FROM
  Schedule
  right outer join range on range.num = Schedule.day
  order by range.num

您可以使用公共表expressin动态生成周日历表:

with range (num) as (
  select 1 union all select 2 union all select 3
  union all select 4 union all select 5 union all select 6
  union all select 7
 )
SELECT
 DATENAME(weekday,  range.num - 1),
  Starts,
  Ends  
FROM
  Schedule
  right outer join range on range.num = Schedule.day
  order by range.num

或者,为天创建一个引用表,然后右键连接到select查询

            SELECT  DATENAME(WEEKDAY, TBL.days - 1) AS days ,
                    starts ,
                    ends
            FROM    ( SELECT    Day days ,
                                Starts ,
                                Ends
                      FROM      Schedule
                    ) T
                    RIGHT JOIN ( SELECT [days]
                                 FROM   ( SELECT    1 [days]
                                          UNION 
                                          SELECT    2
                                          UNION 
                                          SELECT    3
                                          UNION 
                                          SELECT    4
                                          UNION 
                                          SELECT    5
                                          UNION 
                                          SELECT    6
                                          UNION 
                                          SELECT    7
                                        ) S
                               ) TBL ON TBL.days = t.days
结果:

        days         starts    ends
        ------------ --------- ------------
        Monday       NULL      NULL
        Tuesday      09:00     15:00
        Wednesday    09:00     18:00
        Thursday     NULL      NULL
        Friday       10:00     12:00
        Saturday     NULL      NULL
        Sunday       NULL      NULL

        (7 row(s) affected)

或者,为天创建一个引用表,然后右键连接到select查询

            SELECT  DATENAME(WEEKDAY, TBL.days - 1) AS days ,
                    starts ,
                    ends
            FROM    ( SELECT    Day days ,
                                Starts ,
                                Ends
                      FROM      Schedule
                    ) T
                    RIGHT JOIN ( SELECT [days]
                                 FROM   ( SELECT    1 [days]
                                          UNION 
                                          SELECT    2
                                          UNION 
                                          SELECT    3
                                          UNION 
                                          SELECT    4
                                          UNION 
                                          SELECT    5
                                          UNION 
                                          SELECT    6
                                          UNION 
                                          SELECT    7
                                        ) S
                               ) TBL ON TBL.days = t.days
结果:

        days         starts    ends
        ------------ --------- ------------
        Monday       NULL      NULL
        Tuesday      09:00     15:00
        Wednesday    09:00     18:00
        Thursday     NULL      NULL
        Friday       10:00     12:00
        Saturday     NULL      NULL
        Sunday       NULL      NULL

        (7 row(s) affected)

这可能只适用于一周,但如果超过一周呢?在这种情况下,我总是有这样的日程结构,所以我不必担心超过一周。这一天代表什么?实际的星期几?就像@Tanner说的,如果超过一周呢?我会制作一个名为weekdays的表,将您的工作日放在其中,然后左键连接到您的日程表。如果计划中有空天,左联接将添加空行。但是,这仍然不能解决将表ID用作一周中的一天这一明显问题。这可能只适用于一周,但如果超过一周呢?在这种情况下,我始终使用此时间表结构,因此我不必担心超过一周的问题。天代表什么?实际的星期几?就像@Tanner说的,如果超过一周呢?我会制作一个名为weekdays的表,将您的工作日放在其中,然后左键连接到您的日程表。如果计划中有空天,左联接将添加空行。但这仍然无助于解决将表ID用作一周中的一天这一明显问题。您的答案非常适合我需要的,谢谢:-您的答案非常适合我需要的,谢谢:-