SQL - 使用具有聚合函数的子查询

时间:2014-08-01 11:28:42

标签: sql sql-server sql-server-2008

我正在尝试返回为特定客户端发布的上次条目,以及与该条目关联的案例(事项)编号。这种关系是一个客户有很多事情,一个问题有很多时间条目。

我有下面的代码,但它显然会返回所有问题,而不仅仅是与时间条目相关联的问题。我理解为什么,但在尝试纠正它时将自己绑在一起。任何帮助非常感谢。

select c.CLIENT_CODE,
       c.CLIENT_NAME,
       c.OPEN_DATE,
       mp.EMPLOYEE_NAME,
       MAX(tt.TRAN_DATE)[Last Time],
       m.MATTER_NUMBER
from HBM_CLIENT c
join HBM_MATTER m
 on m.CLIENT_UNO=c.CLIENT_UNO
left join TAT_TIME tt
 on tt.MATTER_UNO=m.MATTER_UNO
left join HBM_PERSNL mp
 on mp.EMPL_UNO=c.RESP_EMPL_UNO
where c.STATUS_CODE = 'Targ'
group by c.CLIENT_CODE,
         c.CLIENT_NAME,
         c.OPEN_DATE,
         mp.EMPLOYEE_NAME,
         m.MATTER_NUMBER
order by OPEN_DATE

2 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是使用row_number()。我认为以下内容可以满足您的需求:

select c.CLIENT_CODE, c.CLIENT_NAME, c.OPEN_DATE, mp.EMPLOYEE_NAME,
       tt.TRAN_DATE as [Last Time], m.MATTER_NUMBER
from HBM_CLIENT c join
     (select m.*, tt.TRAN_DATE,
             row_number() over (partition by m.CLIENT_UNO
                                order by tt.TRAN_DATE desc
                               ) as seqnum
      from HBM_MATTER m LEFT JOIN
           TAT_TIME tt
           ON tt.MATTER_UNO = m.MATTER_UNO
     ) m
     ON m.CLIENT_UNO = c.CLIENT_UNO and seqnum = 1 left join
     HBM_PERSNL mp
     on mp.EMPL_UNO=c.RESP_EMPL_UNO
where c.STATUS_CODE = 'Targ';

我认为您不需要group by,除非其他联接创建重复项。

答案 1 :(得分:0)

完全未经测试,但方向正确

select 
  <whatever> 
from 
       HBM_CLIENT c
  join HBM_MATTER m on
    m.CLIENT_UNO = c.CLIENT_UNO
  join TAT_TIME tt on
    tt.MATTER_UNO = m.MATTER_UNO AND
    tt.tran_date = (
       select max(tran_date)
       from TAT_TIME 
       where matter_uno = m.matter_uno)  
where
  m.CLIENT_UNO = ? and 
  c.STATUS_CODE = 'Targ'