怎么用SQL语句直接进行某列的记录旋转为列标识
编号:QA004443
建立日期: 2001年10月9日 最后修改日期:2001年10月9日
所属类别:
xu03:
操作系统:Win
编程工具:SQL70 OR SQL 2000
问题:数据库系统:SQL70 OR SQL 2000
有如下表结构和记录如下:
员工编号 工资类别 金额
--------------- -------------------- --------
1001 请假 50.00
1001 加班 20.00
1001 全勤 100.00
1002 请假 20.00
1002 全勤 10.00
我想通过一个Select语句直接生成如下格式的查询结果:
要求不需要视图或中间表,直接用SQL语句完成,望各位高手指教,我考虑了用 CASE .....WHEN ......END 语句
但不很成功。
查询结果 1:
员工编号 请假 加班 全勤 合计
----------- ----- ---- ---- ----
1001 50 20 100 170
1002 20 10 30
查询结果 2:
员工编号 请假 加班 全勤
----------- ----- ---- ----
1001 50 20 100
1002 20 10
当然如果有行合计和列合计最佳啦!备注:其实我想做的是怎么用SQL语句直接进行某列的记录旋转为列标识。
回答:
hyq的意见:
我用的是oracle,不过sql语句上与SQL SERVER几乎一样的,稍微改动一下decode()即可。
注:decode() 是一个oracle函数,类似:[if 条件 then 语句]
decode(工资类别,'请假',sum(金额)) 等于 if 工资类别='请假' then sum(金额)
这里用了嵌套子查询:
select ...
from ( select ... from ... where ...)
where ...
语句如下:
select 员工编号,sum(请假) as 请假,sum(加班) as 加班,sum(全勤) as 全勤,sum(请假)+sum(加班)+sum(全勤) as 合计
from
(
select 员工编号,decode(工资类别,'请假',sum(金额)) as 请假,decode(工资类别,'加班',sum(金额)) as 加班,
decode(工资类别,'全勤',sum(金额)) as 全勤
from 你的数据表
where 你想要的条件
group by 员工编号,工资类别
)
group by 员工编号
vvrobin的意见:
select a.员工编号 as 员工编号,sum(a.金额) as 请假,sum(b.金额) as 加班,sum(c.金额) as 全勤,sum(d.金额) as 合计 from TheTable as a,TheTable as b,TheTable as c,TheTable as d where a.工资类别 = 请假 and b.工资类别 = 加班 and c.工资类别 = 全勤 and a.员工编号=b.员工编号 and b.员工编号=c.员工编号 and c.员工编号=d.员工编号 group by 员工编号 Having 员工编号 like ?@Para order by 员工编号
此问题由hyq等回答。
| |
|
|
| |
|
|