论坛首页 综合技术论坛

请教关于员工工资统计查询的SQL语句

浏览 8898 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-10-17  
员工表 t_employee

eid         name
----------------
a01         张三
a02         李四

工资表 t_salary

sid     eid      type        amount
-----------------------------------
101     a01      基本工资      5500
102     a01      绩效工资      2000
103     a01      奖    金      1500
104     a02      基本工资      6500
105     a02      绩效工资      2200
106     a02      奖    金      1300

我现在要的查询结果是:

姓名     基本工资      绩效工资      奖    金      合    计
---------------------------------------------------------
张三      5500        2000        1500        9000
李四      6500        2200        1300       10000   

注意:type不是固定的,也许是3项,也许更多.这样的查询语句应该怎样写?
   发表时间:2006-10-17  
可以查询出多个记录集,进行join。
也可以使用临时表。

或者用下面的sql:
select t_employee.name,
基本工资=sum(case type when '基本工资' then amount else 0 end),
绩效工资=sum(case type when '绩效工资' then amount else 0 end),
奖 金=sum(case type when '奖 金' then amount else 0 end),
合 计=sum(amount)
from t_employee,t_salary where t_employee.id=t_salary.eid
group by t_employee.name
0 请登录后投票
   发表时间:2006-10-17  
谢谢together!

如果我的工资表t_salary的type改成salary_time(发放日期),一年有12个月,还这样写是不是太累了?有更优秀的写法吗?
0 请登录后投票
   发表时间:2006-10-17  
oracle:
SELECT   a.NAME, sum(DECODE (b.TYPE, '基本工资', b.amount)) AS 基本工资,
         sum(DECODE (b.TYPE, '绩效工资', b.amount)) AS 绩效工资,
         sum(DECODE (b.TYPE, '奖金', b.amount)) AS 奖金,sum(b.amount) as 合计
    FROM t_employee a, t_salary b
   WHERE a.eid = b.eid group by a.name
0 请登录后投票
   发表时间:2006-10-17  
用动态sql可以满足你
0 请登录后投票
   发表时间:2006-10-17  
看上去像交叉报表.看看琴棋报表吧
0 请登录后投票
   发表时间:2007-01-31  
“如果我的工资表t_salary的type改成salary_time(发放日期),一年有12个月,还这样写是不是太累了?有更优秀的写法吗?”确实呀,我也在寻找更好的办法,没有找到。
我一同事类似“type”的有几十种呀,手工写那么多真是痛苦,不过这样能解决问题,也就罢了。不过这样的查询,如果数据比较多的话,效率是个问题,不知道有没有更好的方案。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics