原始记录数据如下:ID     姓名          社保总金额
1      张三          100
2      李四         200 如何把上面的数据转换成ID   姓名    保险类别     金额
1    张三    养老         50
2    张三    医疗         30
3    张三    失业         20
4    李四    养老         100
5    李四    医疗         60
6    李四    失业         40社保总金额=养老*0.5+医疗*0.3+失业*0.2请高手指教!!

解决方案 »

  1.   

    select ID  ,  姓名 ,  保险类别 = '养老' , 金额 = 社保总金额 * 0.5 from tb
    union all
    select ID  ,  姓名 ,  保险类别 = '医疗' , 金额 = 社保总金额 * 0.3 from tb
    union all
    select ID  ,  姓名 ,  保险类别 = '失业' , 金额 = 社保总金额 * 0.2 from tb
      

  2.   

    ---------------------------------
    --  Author: liangCK 小梁
    ---------------------------------
     
    --> 生成测试数据: @T
    DECLARE @T TABLE (ID INT,姓名 VARCHAR(4),社保总金额 INT)
    INSERT INTO @T
    SELECT 1,'张三',100 UNION ALL
    SELECT 2,'李四',200--SQL查询如下:SELECT
        ID,姓名,保险类别='养老',
        金额=社保总金额*0.5
    FROM @T
    UNION ALL
    SELECT 
        ID,姓名,保险类别='医疗',
        金额=社保总金额*0.3
    FROM @T
    UNION ALL
    SELECT 
        ID,姓名,保险类别='失业',
        金额=社保总金额*0.2
    FROM @T
    ORDER BY ID/*
    ID          姓名   保险类别 金额
    ----------- ---- ---- ---------------------------------------
    1           张三   养老   50.0
    1           张三   医疗   30.0
    1           张三   失业   20.0
    2           李四   失业   40.0
    2           李四   医疗   60.0
    2           李四   养老   100.0(6 行受影响)
    */
      

  3.   

    create table tb(ID int, 姓名 varchar(10),社保总金额 int)
    insert into tb values(1 , '张三' , 100 )
    insert into tb values(2 , '李四' , 200 )select ID , 姓名 , 保险类别 = '养老' , 金额 = 社保总金额 * 0.5 from tb
    union all
    select ID , 姓名 , 保险类别 = '医疗' , 金额 = 社保总金额 * 0.3 from tb
    union all
    select ID , 姓名 , 保险类别 = '失业' , 金额 = 社保总金额 * 0.2 from tb
    order by id , 姓名drop table tb/*
    ID          姓名         保险类别 金额             
    ----------- ---------- ---- -------------- 
    1           张三         养老   50.0
    1           张三         医疗   30.0
    1           张三         失业   20.0
    2           李四         失业   40.0
    2           李四         医疗   60.0
    2           李四         养老   100.0(所影响的行数为 6 行)
    */
      

  4.   

    create table tb(ID int, 姓名 varchar(10),社保总金额 int)
    insert into tb values(1 , '张三' , 100 )
    insert into tb values(2 , '李四' , 200 )select ID , 姓名 , 保险类别 = '养老' , 金额 = 社保总金额 * 0.5 from tb
    union all
    select ID , 姓名 , 保险类别 = '医疗' , 金额 = 社保总金额 * 0.3 from tb
    union all
    select ID , 姓名 , 保险类别 = '失业' , 金额 = 社保总金额 * 0.2 from tb
    order by id , 姓名
    /*
    ID          姓名         保险类别 金额             
    ----------- ---------- ---- -------------- 
    1           张三         养老   50.0
    1           张三         医疗   30.0
    1           张三         失业   20.0
    2           李四         失业   40.0
    2           李四         医疗   60.0
    2           李四         养老   100.0(所影响的行数为 6 行)
    */
    select * into tmp from
    (
      select ID , 姓名 , 保险类别 = '养老' , 金额 = 社保总金额 * 0.5 from tb
      union all
      select ID , 姓名 , 保险类别 = '医疗' , 金额 = 社保总金额 * 0.3 from tb
      union all
      select ID , 姓名 , 保险类别 = '失业' , 金额 = 社保总金额 * 0.2 from tb
    ) tselect id = (select count(*) from 
    tmp m where m.id < n.id or (m.id = n.id and m.保险类别 < n.保险类别)) + 1 , 姓名,保险类别 , 金额 from
    tmp n order by id
    /*
    id          姓名         保险类别 金额             
    ----------- ---------- ---- -------------- 
    1           张三         失业   20.0
    2           张三         养老   50.0
    3           张三         医疗   30.0
    4           李四         失业   40.0
    5           李四         养老   100.0
    6           李四         医疗   60.0(所影响的行数为 6 行)
    */drop table tb,tmp
      

  5.   


    declare @tb table (id int,姓名 nvarchar(10),社保总金额 int)
    insert into @tb select 1,'张三',100
        union all   select 2,'李四',200
    select ROW_NUMBER()over(order by 姓名 desc,金额 desc) as id,姓名,保险类别,金额 from 
    (    
    select id,姓名,保险类别='养老',社保总金额*0.5 as 金额 from @tb
    union all
    select ID,姓名,保险类别='医疗',社保总金额*0.3 as 金额  from @tb
    union all
    select ID,姓名,保险类别='失业',社保总金额*0.2 as 金额 from @tb
    ) A --order by 姓名 desc,金额 desc
    id                   姓名         保险类别 金额
    -------------------- ---------- ---- ---------------------------------------
    1                    张三         养老   50.0
    2                    张三         医疗   30.0
    3                    张三         失业   20.0
    4                    李四         养老   100.0
    5                    李四         医疗   60.0
    6                    李四         失业   40.0(6 行受影响)