select 员工id,工资项1=sum(case when 工资项id=工资数 then 工资数 end),
工资项2=sum(case when 工资项id=津贴 then 工资数 end),
工资项3=sum(case when 工资项id=其他 then 工资数 end)
from 表 group by 员工id
工资项2=sum(case when 工资项id=津贴 then 工资数 end),
工资项3=sum(case when 工资项id=其他 then 工资数 end)
from 表 group by 员工id
解决方案 »
- 自定义函数问题
- access 数据如何导入到SQL中 请给出详细过程
- 高分求一个数据库!!!!
- MSSQL的函数好像没有重载的功能
- 请教一个交叉查询语句
- 关于约束的问题
- 关于禁用XP_CMDSHELL后日志里怎么看到又启动了?
- sql server 2008 数据库引擎优化顾问不支持SQL express
- 我用SQL Server 时出项了问题请高手回答!!!!!!
- 为什么少写了ammeter_id就会出现求和不准确呢?已经想了很久了,还是不明白,大家帮我那!
- JDBC 连接SQL Server 2000数据库错误,解决了马上给分
- 表中有500万条记录,要求随机选择1000条,使用order by newID,结果速度非常慢,要5分钟!请高手解决!100分,在线等
CREATE TABLE SalaryITem
(
sitemID int,
sitemname varchar(20)
)CREATE TABLE SalaryData
(
empid int,
sitemID int,
salaryData int
)insert into SalaryITem values(1,'基本工资')
insert into SalaryITem values(2,'奖金')
insert into SalaryITem values(3,'补贴')insert into SalaryData values(100,1,40)
insert into SalaryData values(100,2,90)
insert into SalaryData values(100,3,30)
insert into SalaryData values(200,1,120)
insert into SalaryData values(200,3,180)select * from SalaryITem
select * from SalaryDatadeclare @s varchar(8000)
set @s = ''
select @s = @s + ',' + sitemname + '=max(case sitemid when ' + cast(sitemid as varchar) + ' then salarydata else '''' end)'
from (select sitemid,sitemname from SalaryITem) a select @s
exec('select empid'+@s+' from SalaryData group by empid')
create table Employee(empid int ,empname varchar(10))
create table SalaryITem(sitemID int ,sitemname varchar(10))
create table SalaryData(sdataID int,empid int,sitemID int,salaryData money)
--插入数据
insert employee
select 1,'aa'
union select 2,'bb'
insert SalaryITem
select 1,'基本工资'
union select 2,'等级工资'
union select 3,'津贴'
insert SalaryData
select 1,1,1,1000
union all select 2,1,2,200
union all select 3,1,3,100
union all select 4,2,1,2000
union all select 5,2,2,100
union all select 6,2,3,400
--交叉表查询
declare @s varchar(4000)
set @s=''
select @s=@s+',['+sitemname+']=max(case sitemID
when '+cast(sitemID as varchar(10))+' then salaryData else 0 end)'
from SalaryITem
exec('select 员工ID=empid'+@s+' from SalaryData group by empid')
--结果
/*
员工ID 基本工资 等级工资 津贴
----------- --------------------- --------------------- ---------------------
1 1000.0000 200.0000 100.0000
2 2000.0000 100.0000 400.0000
*/
工资项2=sum(case when 工资项id=津贴 then 工资数 end),
工资项3=sum(case when 工资项id=其他 then 工资数 end)
from 表 group by 员工id
工资项表的中数据一条一条取出来,然后拼成select语句的字段针对工资表的(即实验由行来列的转换),然后再分组求个小和:),就出来了。
主要要用到动态SQL的方法
仅供参考
set @s='select c.empid'
set select @s=@s+','+'sum(case a.sitemname when'''+a.sitemname+''' then b.salaryData end)['+a.sitemname+']'
from SalaryITem as a
set @s=@s+' from SalaryITem as a
inner join salaryData as b on a.sitemID=b.sitemID
inner join Employee as c on b.empid=c.empid
group by c.empid'exec (@s)--測試結果
empid 基本工資 等級工資 津貼
----------- --------------------- --------------------- ---------------------
1 1000.0000 200.0000 100.0000
2 2000.0000 100.0000 NULL