如何根据某个字段值生成多行记录的新表,通过语句实现,求高手解决。
问题1:
原表结构
姓名 科目 数量
AA 成绩 6
期望值
姓名 科目 数量
AA 语文 1
AA 语文 1
AA 数学 1
AA 数学 1
AA 历史 1
AA 历史 1
期望结果:根据原表的‘数量’字段数据生成新表,其中新表行数为原表的‘数量’字段值,‘科目’字段值为新赋值,求实现方式。
补充,新表的‘科目’列值内容固定,为3种;若原表‘数量’字段值为‘3’则新表生成的记录如下:
姓名 科目 数量
AA 语文 1
AA 数学 1
AA 历史 1
问题2:
原表结构
姓名 科目 数量
AA 成绩 1
期望值
姓名 科目 数量
AA 语文 1
AA 数学 1
AA 历史 1
期望结果:根据原表的‘数量’字段数据生成新表,‘科目’字段值为新赋值,求实现方式。
补充,新表的‘科目’列值内容固定,为3种。
------解决方案--------------------第二个问题简单点
insert 新表
select 姓名, 科目 = '语文', 数量 from 原表 union all
select 姓名, 科目 = '数学', 数量 from 原表 union all
select 姓名, 科目 = '历史', 数量 from 原表
------解决方案--------------------if object_id('[TB]') is not null drop table [TB]
go
create table [TB] (姓名 nvarchar(4),科目 nvarchar(4),数量 int)
insert into [TB]
select 'AA','成绩',6
select * from [TB]
SELECT 姓名 ,
CASE WHEN M.number % 3 = 0 THEN '历史'
ELSE CASE WHEN M.number % 2 = 0 THEN '数学'
ELSE '语文'
END
END AS '成绩' ,
1
FROM TB
INNER JOIN MASTER..spt_values M ON M.number < TB.数量
WHERE M.type = 'P'
ORDER BY CASE WHEN M.number % 3 = 0 THEN '历史'
ELSE CASE WHEN M.number % 2 = 0 THEN '数学'
ELSE '语文'
END
END DESC