请教一SQL语句

qxm 2003-03-25 10:09:57
表结构为员工代码,日期(6位,4位年2位月)和工资
每个月每个员工的工资就是一条记录,现在要出工资报表,要求是每个员工一年12个月的工资就是一行,怎么样可是实现一条SQL语句就能选出12条记录,并且按月份插入一行中?
简单说,就是一个表a(emp_code,emp_date,emp_salary),
另一个表b(emp_code,emp_1,emp_2,emp_3,,emp_4,emp_5,emp_6,,emp_7,emp_8,emp_9,,emp_10,emp_11,emp_12),
其中emp_1就是在A表中一月份的员工工资。
...全文
11 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qxm 2003-03-28
你的速度快一点,好象就一秒。
另两人的稍微慢一点,2秒。
我是直接在服务器上测试的。
不过只有24条记录,两个人全年的工资情况。
回复
yltfc 2003-03-26
drop table a
create table a(emp_code int ,
emp_date nvarchar(7),
emp_salary decimal(10,2)
)
insert a(emp_code,emp_date,emp_salary) values(1,'2003.01',10)
insert a(emp_code,emp_date,emp_salary) values(1,'2003.02',10)
insert a(emp_code,emp_date,emp_salary) values(1,'2003.03',10)
insert a(emp_code,emp_date,emp_salary) values(1,'2003.04',10)


drop table b
create table b(emp_code int ,
emp_date nvarchar(7) ,
emp_salary decimal(10,2),
emp_01 decimal(10,2),
emp_02 decimal(10,2),
emp_03 decimal(10,2),
emp_04 decimal(10,2),
emp_05 decimal(10,2),
emp_06 decimal(10,2),
emp_07 decimal(10,2),
emp_08 decimal(10,2),
emp_09 decimal(10,2),
emp_10 decimal(10,2),
emp_11 decimal(10,2)
)

insert b(emp_code,emp_date,emp_salary) select * from a

declare @ls nvarchar(10),
@ls1 nvarchar(10),
@ls_sql nvarchar(100),
@i int

set @i = 1
while @i <= 11
begin

set @ls = right('00'+convert(nvarchar(2),@i),2)
set @ls1 = '2003.'+@ls
set @ls_sql = 'update b set emp_'+@ls+' = emp_salary where emp_date = '''+@ls1+''''

execute(@ls_sql)
set @i = @i + 1

end

select emp_code,sum(emp_01) as emp_01,sum(emp_02) as emp_02,sum(emp_03) as emp_03 from b group by emp_code
回复
yltfc 2003-03-26
能告诉我测试结果吗?
每个花费的时间是多少?
回复
qxm 2003-03-26
yltfc() :你的方法会产生许多空间的浪费,我感觉。
不过你们三的方法都可以用,我就一人10分吧
回复
yoki 2003-03-25
我觉得你的时间设置为datetime类型的话更好些,可以显著提高效率
回复
yoki 2003-03-25
用大力的可能效率一样,因为都是用的case判断
他的好处在于可以使用再列数不确定的地方,
因为你的是统计12个月的,所以列数一定,才能用我的方法
不知道是否还有其他更为有效的方法,关注~
回复
yoki 2003-03-25
改正大力的:
declare @sql varchar(8000)
set @sql = 'select emp_code'
select @sql = @sql + ',sum(case right(emp_date,2) when '''+cast(right(emp_date,2) as varchar)+''' then emp_salary else 0 end) as '''+cast(right(emp_date,2) as varchar)+'月'''
from (select distinct * from a) as a
select @sql = @sql+' from a where left(emp_date,4)='统计的年份' group by emp_code'

exec(@sql)
go

回复
qxm 2003-03-25
yoki(小马哥) :把GROUP放在最后面就正确了。
但问题是效率太低了,我在A表中只有12条记录,即一个员工一年的工作情况,就用了23秒钟,有有没有更有效的办法呢?
回复
qxm 2003-03-25
pengdali(大力) :执行出错,错误信息:
服务器: 消息 8155,级别 16,状态 2,行 3
没有为第 1 列(属于 'a')指定列。
就是在“sum(case right(emp_date,2) ”这个地方。
回复
yoki 2003-03-25
select emp_code,
sum(case right(emp_date,2) when 1 then emp_salary else 0 end) emp_1,
sum(case right(emp_date,2) when 2 then emp_salary else 0 end) emp_2,
sum(case right(emp_date,2) when 3 then emp_salary else 0 end) emp_3,
sum(case right(emp_date,2) when 4 then emp_salary else 0 end) emp_41,
sum(case right(emp_date,2) when 5 then emp_salary else 0 end) emp_51,
sum(case right(emp_date,2) when 6 then emp_salary else 0 end) emp_6,
sum(case right(emp_date,2) when 7 then emp_salary else 0 end) emp_7,
sum(case right(emp_date,2) when 8 then emp_salary else 0 end) emp_8,
sum(case right(emp_date,2) when 9 then emp_salary else 0 end) emp_9,
sum(case right(emp_date,2) when 10 then emp_salary else 0 end) emp_10,
sum(case right(emp_date,2) when 11 then emp_salary else 0 end) emp_11,
sum(case right(emp_date,2) when 12 then emp_salary else 0 end) emp_12
from a group by emp_code,left(emp_date,4)
where left(emp_date,4)='你要统计的年份'
回复
subunlee 2003-03-25
還有一個做法就是只有SQL語句,建立一分析篩選出一個個臨時表,這個臨時表就是表二,然後把臨時表的所有數據insert到第二張表當中。
回复
pengdali 2003-03-25
declare @sql varchar(8000)
set @sql = 'select emp_code'
select @sql = @sql + ',sum(case right(emp_date,2) when '''+cast(right(emp_date,2) as varchar)+''' then emp_salary else 0 end) as '''+cast(right(emp_date,2) as varchar)+'月'''
from (select distinct right(emp_date,2) from 表a) as a
select @sql = @sql+' from 表a where left(emp_date,4)=year(getdate()) group by emp_code'

exec(@sql)
go
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2003-03-25 10:09
社区公告
暂无公告