【问题标题】:How can I add empty rows in SQL SERVER for this example?对于此示例,如何在 SQL SERVER 中添加空行?
【发布时间】:2018-01-25 16:03:43
【问题描述】:

Sql Fiddle Example

我有这个表结构:

    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

我怎样才能得到这个?,谢谢

【问题讨论】:

  • 这可能工作一周,但如果超过 1 周怎么办?
  • 在这种情况下,我的日程安排一直是这个结构,所以我不必担心超过一周
  • day 代表什么?实际的工作日?就像@Tanner 说的,如果超过一周怎么办?我会制作一个名为“工作日”的表格并将您的日子放在那里,然后左连接到您的日程表。如果 Schedule 中有空天,Left join 将添加 NULL 行。但这仍然无助于您(明显)使用表 ID 作为星期几的问题。

标签: sql-server sql-server-2012 days


【解决方案1】:

我会创建一个 empy 基表并执行 LEFT JOIN:

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

【讨论】:

    【解决方案2】:

    如果你不想创建新表,你可以使用它

    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
    

    【讨论】:

      【解决方案3】:

      或者,创建一个几天的参考表,然后右连接到您的选择查询。

                  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)
      

      【讨论】:

      • 您的回答非常适合我的需要,谢谢:-)
      【解决方案4】:

      您可以使用通用表表达式动态生成周历“表”:

      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
      

      Fiddle

      【讨论】:

        猜你喜欢
        • 2018-03-22
        • 1970-01-01
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        • 2017-01-27
        • 2019-05-21
        • 2019-10-31
        相关资源
        最近更新 更多