现在我有一个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这种情况,不知道该怎么写

解决方案 »

  1.   


    select 月份,人员,部门,sum_1
      from(
           select 月份,人员,部门,总成绩,sum(总成绩)over(partition by 人员)as sum_1
             from table)
     where 部门 = 'D2'
       and 月份 = '201002';
      

  2.   

    月份 人员 部门 总成绩
    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.   

    A的年度总成绩(3个部门全部加一起)就是na3如果要求A在D3部门的总成绩,则na3-na2-na1
      

  4.   

    这个我写错了。
    的年度总成绩(3个部门全部加一起)就是na3如果要求A在D3部门的总成绩,则na3-na2  (na2已经包含na1了)
      

  5.   

    这个用一个sql语句很难实现,还是用过程实现吧
      

  6.   


    --没弄明白你表达的意思,重写下
    [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>
      

  7.   

    写了一个,看看满足需求不SQL> WITH t AS (
      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
      

  8.   

    ls的ls的结果是对的,非常感谢,我先学习一下。