日期:2014-05-17  浏览次数:20452 次

如何根据某个字段值生成多行记录的新表,通过语句实现,求高手解决。
问题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