生成固定行数据,不够部分补空白

wwfxgm 2018-12-14 06:00:59
我提供了一些测试的数据, 我想实现每个姓名,产生16的倍数行数据, 比如 周宜 只是出现1次, 那么应该是 再补足15行(补足部分,就name重复,count字段不需要内容)如下图所示。

张杰 刚好是 16 ,不用补足。 陈洪静 是 17 。那么应该补足16的倍数行,再补足 15行。 鲁姬 是 18 ,那么也应该补足14行。

结果如下:(注意,count 字段,补足部分不要内容)


INSERT INTO dbo.name([name], [count]) VALUES (N'周宜', 1); GO
INSERT INTO dbo.name([name], [count]) VALUES (N'郑秋荣', 11); GO
INSERT INTO dbo.name([name], [count]) VALUES (N'洪亦寒', 12); GO
INSERT INTO dbo.name([name], [count]) VALUES (N'李思', 13); GO
INSERT INTO dbo.name([name], [count]) VALUES (N'吴名媛', 14); GO
INSERT INTO dbo.name([name], [count]) VALUES (N'戚碧香', 15); GO
INSERT INTO dbo.name([name], [count]) VALUES (N'张杰', 16); GO
INSERT INTO dbo.name([name], [count]) VALUES (N'陈洪静', 17); GO
INSERT INTO dbo.name([name], [count]) VALUES (N'鲁姬', 18); GO



...全文
113 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2018-12-14
  • 打赏
  • 举报
回复
INSERT INTO  name
SELECT name,null FROM (SELECT t.*
FROM
(SELECT *, (16 - [count] % 16)+[count]-1 AS needcount FROM name) t
CROSS APPLY
(
SELECT *
FROM master.dbo.spt_values
WHERE type = 'P'
AND number
BETWEEN 1 AND needcount
) t1
WHERE t.needcount <> 16)tt


测试:
SELECT name,COUNT(1) FROM name GROUP BY name


wwfxgm 2018-12-14
  • 打赏
  • 举报
回复
我思考了一下,稍微修改版主的代码,
SELECT name, case when [count]< 16 then 16-[count] when [count] > 16 then 32-[count] else 0 end AS needcount FROM name


下面代码调试不出来了,我需要的行数已经出现在 needcount 字段里面了。但是如何产生呢?
二月十六 2018-12-14
  • 打赏
  • 举报
回复
引用 4 楼 wwfxgm 的回复:
鲁姬 是 18 ,那么应该再补14行,到32行。 陈洪静是17,那么应该再补15行,到32行。 张杰 是 16,不用补足行。 吴名媛 是 14,应该再补2行。到16行。 郑秋荣 是11 ,应该再补5行,到16行。
好的,了解了,原理差不多,楼主你自己理解下,不行的话,我回家给你看看
wwfxgm 2018-12-14
  • 打赏
  • 举报
回复
鲁姬 是 18 ,那么应该再补14行,到32行。
陈洪静是17,那么应该再补15行,到32行。
张杰 是 16,不用补足行。
吴名媛 是 14,应该再补2行。到16行。
郑秋荣 是11 ,应该再补5行,到16行。
wwfxgm 2018-12-14
  • 打赏
  • 举报
回复
引用 2 楼 二月十六 的回复:
INSERT INTO  name
SELECT name,null FROM (SELECT t.*,ROW_NUMBER()OVER(PARTITION BY t.name ORDER BY GETDATE()) rn
FROM
(SELECT *, 16 - [count] % 16 AS needcount FROM name) t
CROSS APPLY
(
SELECT *
FROM master.dbo.spt_values
WHERE type = 'P'
AND number
BETWEEN 1 AND needcount
) t1
WHERE t.needcount <> 16)tt


这个语句就是 超过16的。没有产生16倍数的行, 比如 陈洪静 是 17 。应该再补足15行。合计是32行。也就是16的倍数行。
二月十六 2018-12-14
  • 打赏
  • 举报
回复
INSERT INTO  name
SELECT name,null FROM (SELECT t.*,ROW_NUMBER()OVER(PARTITION BY t.name ORDER BY GETDATE()) rn
FROM
(SELECT *, 16 - [count] % 16 AS needcount FROM name) t
CROSS APPLY
(
SELECT *
FROM master.dbo.spt_values
WHERE type = 'P'
AND number
BETWEEN 1 AND needcount
) t1
WHERE t.needcount <> 16)tt

name	count
陈洪静 17
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
洪亦寒 12
洪亦寒 NULL
洪亦寒 NULL
洪亦寒 NULL
洪亦寒 NULL
李思 NULL
李思 NULL
李思 NULL
李思 13
鲁姬 18
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
戚碧香 15
戚碧香 NULL
吴名媛 14
吴名媛 NULL
吴名媛 NULL
张杰 16
郑秋荣 11
郑秋荣 NULL
郑秋荣 NULL
郑秋荣 NULL
郑秋荣 NULL
郑秋荣 NULL
周宜 1
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
二月十六 2018-12-14
  • 打赏
  • 举报
回复
是这个意思?
INSERT INTO  name
SELECT name,null FROM (SELECT t.*,ROW_NUMBER()OVER(PARTITION BY t.name ORDER BY GETDATE()) rn
FROM
(SELECT *, 16 - [count] % 16 AS needcount FROM name) t
CROSS APPLY
(
SELECT *
FROM master.dbo.spt_values
WHERE type = 'P'
AND number
BETWEEN 1 AND needcount
) t1
WHERE t.needcount <> 16)tt
WHERE rn<>1


结果:
name	count
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 NULL
陈洪静 17
洪亦寒 12
洪亦寒 NULL
洪亦寒 NULL
洪亦寒 NULL
李思 NULL
李思 NULL
李思 13
鲁姬 18
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
鲁姬 NULL
戚碧香 15
吴名媛 14
吴名媛 NULL
张杰 16
郑秋荣 11
郑秋荣 NULL
郑秋荣 NULL
郑秋荣 NULL
郑秋荣 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 NULL
周宜 1

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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