SQL Server-复制和修改一年的数据

时间:2018-12-14 15:00:57

标签: sql-server sql-update

这里需要指南。 我有一套2019年的记录,整个365天都需要进行一些更新。我需要做的事情是:

  1. 从表中的另一列更新一列。因此,staffing_date列=日期。
  2. 将记录的副本复制到同一表中。
  3. 使用“天”或“夜”更新列。 1天会有2条记录-1条记录为“白天”,1条记录为“夜晚”
  4. 根据其他列中的值更新一列,即,如果它是“ day”和“ weekday”,则leave_num =38。如果是“ night”和“ weekend”,则请假num = 33。

数据示例:

Staffing_date   day_night caldendar_year    date     weekend_ind  month leave_num   
NULL            NULL         2019        2019-01-01   WEEKDAY      1     NULL  
NULL            NULL         2019        2019-01-02   WEEKDAY      1     NULL
NULL            NULL         2019        2019-01-12   WEEKEND      1     NULL

Staffing_date需要更新为同一行中的日期。我想我可以弄清楚这部分,但是对于其余部分,我不确定什么是最好的方法?

对于#3,我尝试按照下面的建议使用CROSS APPLY,但是我认为我使用的不正确。

insert into mytable (day_night)
select days
from mytable
CROSS APPLY (
values('day'), ('night')) v(days)
where calendar_year = '2019'

2 个答案:

答案 0 :(得分:1)

如果我按照您提到的确切顺序,那就是:

  1. 从表中的另一列更新一列。 更新MyTable SET MyCol1 = Mycol2

  2. 复制记录。 在同一张桌子里面? O,您只需要此表的备份(SELECT INTO ..),如果要插入同一表中,则应向我们提供结构和PK-NC以及与之相关的所有限制。

3。使用“ Day”或“ Night”更新一列 您将使用什么标准替换白天或黑夜。

4。根据其他列的值更新列,即是否为“天” 然后是“工作日”,则Leave_num = 38。

Update MyTable  set
column1 = (case when condition<(column2='Day" And column3="weekday)> then leave_num=38 else column1 end) .....

答案 1 :(得分:1)

如果只剩下3和4,则可以使用day和{{1}轻松获得表中具有值nightAPPLY的每个值}

VALUES

最后,要获得您的33/38逻辑,这可能取决于您的语言:

FROM YourTable YT
    CROSS APPLY (VALUES('Day'),('Night')) V(Day_Night)

请注意,上面的代码对于夜晚的工作日和周末的白天时间没有逻辑,因此将返回值CASE WHEN V.Day_Night = 'Day' AND DATENAME(WEEKDAY,YT.[date]) IN ('Monday','Tuesday','Wednesday','Thursday','Friday') THEN 38 WHEN V.Day_Night = 'Night' AND DATENAME(WEEKDAY,YT.[date]) IN ('Saturday','Sunday') THEN 38 END