原始记录数据如下: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 张三 100
2 李四 200 如何把上面的数据转换成ID 姓名 保险类别 金额
1 张三 养老 50
2 张三 医疗 30
3 张三 失业 20
4 李四 养老 100
5 李四 医疗 60
6 李四 失业 40社保总金额=养老*0.5+医疗*0.3+失业*0.2请高手指教!!
解决方案 »
- 求一条updatesql语句。希望你们能进来帮帮我。谢谢你们了。
- 有一个算法困扰我了.不知道难不难,我是被绕住了。
- 100分急盼解决在WIN2003中存储过程的问题,在线等
- 这样的语句怎么写啊?
- Sql 2008rc2 硬盘读取过高排查
- 求助,如何在sql server 2005 中显示默认实例和命名实例
- 一个简单的问题, 在线等
- to KingSunSha(弱水三千):help, 一个sql更新问题。
- access中的视图能否导入到sql server中成为其中的视图?
- 如何在SQLSERVER中使用存储过程来完成树状查询!(特急,请帮忙),
- 这条语句怎样写?
- 请大师帮忙,如何用存储过程实现表删除
union all
select ID , 姓名 , 保险类别 = '医疗' , 金额 = 社保总金额 * 0.3 from tb
union all
select ID , 姓名 , 保险类别 = '失业' , 金额 = 社保总金额 * 0.2 from tb
-- 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 行受影响)
*/
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 行)
*/
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
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 行受影响)