现在我有一个table,保存全部部门全部人员的总成绩,定期(每个月)产生一个成绩记录,数据诸如:
月份 人员 部门 总成绩
201001 A D1 na1
201001 B D2 nb1
201002 A D2 na2
201002 B D2 nb2
注:对某个人,不论换没换部门,最新一个记录的成绩就是他本年度的总成绩(待过的全部部门加起来)现在想在一个sql里查出某个部门当前各个人员在本部门内的年度总成绩,该怎么写呢?
比如查D2 部门,现在只能查到
201002 A D2 na2
201002 B D2 nb2 B没有换过部门,结果是对的。
A的值应该是na2-na1这个sql该怎么写呢?像A这种情况,不知道该怎么写
月份 人员 部门 总成绩
201001 A D1 na1
201001 B D2 nb1
201002 A D2 na2
201002 B D2 nb2
注:对某个人,不论换没换部门,最新一个记录的成绩就是他本年度的总成绩(待过的全部部门加起来)现在想在一个sql里查出某个部门当前各个人员在本部门内的年度总成绩,该怎么写呢?
比如查D2 部门,现在只能查到
201002 A D2 na2
201002 B D2 nb2 B没有换过部门,结果是对的。
A的值应该是na2-na1这个sql该怎么写呢?像A这种情况,不知道该怎么写
select 月份,人员,部门,sum_1
from(
select 月份,人员,部门,总成绩,sum(总成绩)over(partition by 人员)as sum_1
from table)
where 部门 = 'D2'
and 月份 = '201002';
201001 A D1 na1
201001 B D2 nb1
201002 A D2 na2
201002 B D2 nb2
201003 A D3 na3
201003 B D2 nb3上面的情况A的总成绩怎么计算?na3-na2-na1?
的年度总成绩(3个部门全部加一起)就是na3如果要求A在D3部门的总成绩,则na3-na2 (na2已经包含na1了)
--没弄明白你表达的意思,重写下
[TEST@orcl] SQL>with t1 as(
2 select 201001 as c1,'A' as c2, 'D1' as C3, 100 as c4 from dual union
3 select 201001 as c1,'B' as c2, 'D2' as C3, 100 as c4 from dual union
4 select 201002 as c1,'A' as c2, 'D2' as C3, 150 as c4 from dual union
5 select 201002 as c1,'B' as c2, 'D2' as C3, 200 as c4 from dual
6 ),t2 as(
7 select c1,c2,c3,c4,
8 lag(c3,1,-1)over(partition by c2 order by c1) last_C3,
9 lag(c4,1,0)over(partition by c2 order by c1) as last_C4 from t1
10 )select c1,c2,c3,decode(c3,last_c3,0,-1)*last_c4+c4
11 from t2
12 where c1 ='201002'
13 and C3 ='D2'; C1 C C3 DECODE(C3,LAST_C3,0,-1)*LAST_C4+C4
---------- - -- ----------------------------------
201002 A D2 50
201002 B D2 200[TEST@orcl] SQL>
2 SELECT '201001' ym, 'A' emp_no,'D1' dept_no,10 score FROM DUAL UNION ALL
3 SELECT '201001' ym, 'B' emp_no,'D2' dept_no,15 score FROM DUAL UNION ALL
4 SELECT '201002' ym, 'A' emp_no,'D2' dept_no,20 score FROM DUAL UNION ALL
5 SELECT '201002' ym, 'B' emp_no,'D2' dept_no,30 score FROM DUAL UNION ALL
6 SELECT '201003' ym, 'A' emp_no,'D3' dept_no,30 score FROM DUAL UNION ALL
7 SELECT '201003' ym, 'B' emp_no,'D2' dept_no,50 score FROM DUAL
8 )
9 SELECT m.emp_no,
10 m.dept_no,
11 SUM(CASE
12 WHEN m.emp_no <> m.l_emp_no THEN
13 m.score
14 ELSE
15 m.score - m.l_score
16 END) score
17 FROM (SELECT t.ym,
18 t.emp_no,
19 t.dept_no,
20 t.score,
21 LAG(t.score, 1, 0) OVER(ORDER BY t.emp_no, t.ym) l_score,
22 LAG(emp_no, 1) OVER(ORDER BY t.emp_no, t.ym) l_emp_no
23 FROM t
24 ORDER BY t.emp_no,
25 t.ym) m
26 GROUP BY m.emp_no,m.dept_no
27 ORDER BY m.dept_no,m.emp_no
28 ;EMP_NO DEPT_NO SCORE
------ ------- ----------
A D1 10
A D2 10
B D2 50
A D3 10