sql 把1条数据按照一定规则拆分并插入新表

qq_33079425 2017-06-19 11:49:26

表A
ID 加班人 加班内容 开始时间 结束时间 予以调休时间 单位
XJ0001 张三 整理报表 2017/6/17 2017/6/18 8 时
XJ0002 李四 参加培训 2017/6/9 2017/6/10 10 时

表B
ID 加班人 加班内容 开始时间 结束时间 予以调休时间 单位
XJ0001-1 张三 整理报表 2017/6/17 2017/6/18 4 时
XJ0001-2 张三 整理报表 2017/6/17 2017/6/18 4 时
XJ0002-1 李四 参加培训 2017/6/9 2017/6/10 4 时
XJ0002-2 李四 参加培训 2017/6/9 2017/6/10 4 时
XJ0002-3 李四 参加培训 2017/6/9 2017/6/10 2 时

说明:
1、A表以4小时为单位进行拆分,不足4小时单独列1条
2、A表每插入1条数据,均按上面的规则自动进行拆分并插入B表(新的ID号另外在原ID号上-1,-2…)


忘告诉指点一二,不胜感谢!

CREATE TABLE #A(ID VARCHAR(20),加班人 VARCHAR(200),加班内容 VARCHAR(200),开始时间 VARCHAR(20),结束时间 VARCHAR(20),予以调休时间 decimal(9, 2),时间单位 VARCHAR(200))
INSERT INTO #A VALUES
('XJ0001','张三','整理报表','2017/06/17 8:30:00','2017/06/18 18:00:00',8,'时'),
('XJ0002','李四','参加培训','2017/06/09 8:30:00','2017/06/10 12:00:00',10,'时')
...全文
359 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2017-06-21
  • 打赏
  • 举报
回复
引用 3 楼 qq_33079425 的回复:
谢谢2位的回复,但是与我的需求还有点差距啊。
哪里还有差距?
qq_33079425 2017-06-21
  • 打赏
  • 举报
回复
谢谢2位的回复,但是与我的需求还有点差距啊。
二月十六 2017-06-21
  • 打赏
  • 举报
回复
CREATE TABLE #A
(
ID VARCHAR(20) ,
加班人 VARCHAR(200) ,
加班内容 VARCHAR(200) ,
开始时间 VARCHAR(20) ,
结束时间 VARCHAR(20) ,
予以调休时间 INT,
时间单位 VARCHAR(200)
)
INSERT INTO #A
VALUES ( 'XJ0001', '张三', '整理报表', '2017/06/17 8:30:00',
'2017/06/18 18:00:00', 8, '时' ),
( 'XJ0002', '李四', '参加培训', '2017/06/09 8:30:00',
'2017/06/10 12:00:00', 10, '时' )
;WITH cte AS (
SELECT a.ID ,
a.加班人 ,
a.加班内容 ,
a.开始时间 ,
a.结束时间 ,
CASE WHEN a.予以调休时间 - 4 > 4 THEN 4
ELSE a.予以调休时间 - 4
END AS 予以调休时间 ,
a.时间单位 ,
a.予以调休时间 AS 剩余时间
FROM #A a
UNION ALL
SELECT a.ID ,
a.加班人 ,
a.加班内容 ,
a.开始时间 ,
a.结束时间 ,
CASE WHEN b.剩余时间 - 4 > 4 THEN 4
ELSE b.剩余时间 - 4
END AS 予以调休时 ,
a.时间单位 ,
b.剩余时间 - 4
FROM #A a
JOIN cte b ON b.ID = a.ID
WHERE b.剩余时间 - 4 > 0
)
SELECT RTRIM(Id) + '-'
+ RTRIM(ROW_NUMBER() OVER ( PARTITION BY Id ORDER BY Id )) AS Id ,
加班人 ,
加班内容 ,
开始时间 ,
结束时间 ,
予以调休时间 ,
时间单位
FROM cte
ORDER BY ID

DROP TABLE #A


qq_33079425 2017-06-21
  • 打赏
  • 举报
回复
1、A表以4小时为单位进行拆分,不足4小时单独列1条 2、A表每插入1条数据,均按上面的规则自动进行拆分并插入B表(新的ID号另外在原ID号上-1,-2…)
  • 打赏
  • 举报
回复

declare @a table(id varchar(20),加班人 varchar(200),加班内容 varchar(200),开始时间 varchar(20),结束时间 varchar(20),予以调休时间 decimal(9, 2),时间单位 varchar(200))
insert into @a values
('xj0001','张三','整理报表','2017/06/17  8:30:00','2017/06/18  18:00:00',8,'时'),
('xj0002','李四','参加培训','2017/06/09  8:30:00','2017/06/10  12:00:00',10,'时')
select a.id+'-'+rtrim(number) as id,a.加班人,a.加班内容,a.开始时间,a.结束时间,(case when number*4<=a.予以调休时间 then 4 else a.予以调休时间 -(number-1)*4 end) [予以调休时间],a.时间单位 from @a a,master..spt_values where type='p' and number>0 and (number-1)*4<a.予以调休时间
二月十六 2017-06-19
  • 打赏
  • 举报
回复
CREATE TABLE #A
(
ID VARCHAR(20) ,
加班人 VARCHAR(200) ,
加班内容 VARCHAR(200) ,
开始时间 VARCHAR(20) ,
结束时间 VARCHAR(20) ,
予以调休时间 INT,
时间单位 VARCHAR(200)
)
INSERT INTO #A
VALUES ( 'XJ0001', '张三', '整理报表', '2017/06/17 8:30:00',
'2017/06/18 18:00:00', 8, '时' ),
( 'XJ0002', '李四', '参加培训', '2017/06/09 8:30:00',
'2017/06/10 12:00:00', 10, '时' )
;WITH cte AS (
SELECT a.ID ,
a.加班人 ,
a.加班内容 ,
a.开始时间 ,
a.结束时间 ,
CASE WHEN a.予以调休时间 - 4 > 4 THEN 4
ELSE a.予以调休时间 - 4
END AS 予以调休时间 ,
a.时间单位 ,
a.予以调休时间 AS 剩余时间
FROM #A a
UNION ALL
SELECT a.ID ,
a.加班人 ,
a.加班内容 ,
a.开始时间 ,
a.结束时间 ,
CASE WHEN b.剩余时间 - 4 > 4 THEN 4
ELSE b.剩余时间 - 4
END AS 予以调休时 ,
a.时间单位 ,
b.剩余时间 - 4
FROM #A a
JOIN cte b ON b.ID = a.ID
WHERE b.剩余时间 - 4 > 0
)
SELECT * FROM cte ORDER BY ID

DROP TABLE #A


27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧