首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求Sql查询语句,该怎么解决

2012-01-07 
求Sql查询语句表一:姓名编号张三0001张三0002李四0003王五0004赵六0005赵六0006赵六0007表二:b1年份000100

求Sql查询语句
表一:

姓名     编号

张三     0001
张三     0002          
李四     0003
王五     0004
赵六     0005
赵六     0006
赵六     0007

表二:

b1

年份     0001     0002     0003   0004     0005     0006     0007
2005         1           2           3         4           5           6           7
2006         8           9           10       11         12         13         14
2007         15         16         17       18         19         20         21

想得到这样的输出:

姓名     编号     2007

张三     0001         31
李四     0003         10
王五     0004         11
赵六     0005         60

[解决办法]
那李四 和王五应该是17 18 啊
[解决办法]
--创建测试环境
create table a(姓名 varchar(10), 编号 varchar(10))
create table b(年份 int, [0001] int, [0002] int, [0003] int,[0004] int,[0005] int
,[0006] int,[0007] int)
--插入测试数据
insert a(姓名,编号)
select '张三 ', '0001 ' union all
select '张三 ', '0002 ' union all
select '李四 ', '0003 ' union all
select '王五 ', '0004 ' union all
select '赵六 ', '0005 ' union all
select '赵六 ', '0006 ' union all
select '赵六 ', '0007 '
insert b(年份,[0001],[0002],[0003],[0004],[0005],[0006],[0007])
select '2005 ', '1 ', '2 ', '3 ', '4 ', '5 ', '6 ', '7 ' union all
select '2006 ', '8 ', '9 ', '10 ', '11 ', '12 ', '13 ', '14 ' union all
select '2007 ', '15 ', '16 ', '17 ', '18 ', '19 ', '20 ', '21 '

--求解过程
select a.姓名,sum(b.num) as [2007]
from a
join (
select 年份,[0001] as num, '0001 ' as 编号 from b union all
select 年份,[0002], '0002 ' as 编号 from b union all
select 年份,[0003], '0003 ' as 编号 from b union all
select 年份,[0004], '0004 ' as 编号 from b union all
select 年份,[0005], '0005 ' as 编号 from b union all
select 年份,[0006], '0006 ' as 编号 from b union all
select 年份,[0007], '0007 ' as 编号 from b
) b on a.编号 = b.编号
where b.年份 = 2007
group by a.姓名
order by a.姓名


--删除测试环境
drop table a,b

/*--测试结果
姓名 2007
---------- -----------
李四 17
王五 18
张三 31
赵六 60

(所影响的行数为 4 行)
*/


[解决办法]
--有事先写到这里

create table A(姓名 varchar(20), 编号 varchar(20))
insert A select '张三 ', '0001 '


union all select '张三 ', '0002 '
union all select '李四 ', '0003 '
union all select '王五 ', '0004 '
union all select '赵六 ', '0005 '
union all select '赵六 ', '0006 '
union all select '赵六 ', '0007 '

create table B(年份 int, [0001] int, [0002] int, [0003] int, [0004] int, [0005] int, [0006] int, [0007] int)
insert B select 2005, 1, 2, 3, 4, 5, 6, 7
union all select 2006, 8, 9, 10, 11, 12, 13, 14
union all select 2007, 15, 16, 17, 18, 19, 20, 21

create proc pc(@姓名 varchar(20), @ret int output)
as
begin
declare @sql nvarchar(4000)
set @sql= 'select @ret= '
select @sql=@sql+quotename(编号)+ '+ ' from A where 姓名=@姓名
select @sql=left(@sql, len(@sql)-1), @sql=@sql+ ' from B where 年份=2007 '
exec sp_executesql @sql, N '@ret int output ', @ret output
end

declare @ret int
exec pc '赵六 ', @ret out
select @ret

热点排行