2011-10-14 56 views
1

在查询中获取数据集时每个客户端返回一个日期时出现问题。TSQL - 返回最近的日期

要求:

  • 必须有最近的每个客户端列表交易的日期为用户
  • 将需要有通过EXEC运行能力

当前查询:

SELECT 
    c.client_uno 
    , c.client_code 
    , c.client_name 
    , c.open_date 
into #AttyClnt 
from hbm_client c 
    join hbm_persnl p on c.resp_empl_uno = p.empl_uno 
where p.login = @login 
    and c.status_code = 'C' 

select 
    ba.payr_client_uno as client_uno 
    , max(ba.tran_date) as tran_date 
from blt_bill_amt ba 
    left outer join #AttyClnt ac on ba.payr_client_uno = ac.client_uno 
where ba.tran_type IN ('RA', 'CR') 
group by ba.payr_client_uno 

目前,这个查询会为每个客户端产生至少1行的日期,问题在于有些客户端会有2到10个与他们相关的日期,将返回表格扩大到大约30,000行,而不是理想化的246行或更少。

当我尝试使用max(tran_uno)来获取最近的交易编号时,我得到了相同的结果,其中一些有1值,而其他值有多个值。

更大的图片有其他4个其他部分正在执行其他部分,我只包括了与问题有关的部分。

编辑(2011-10-14 @ 1:45 PM):

select 
    ba.payr_client_uno as client_uno 
    , max(ba.row_uno) as row_uno 
into #Bills 
from blt_bill_amt ba 
    inner join hbm_matter m on ba.matter_uno = m.matter_uno 
     inner join hbm_client c on m.client_uno = c.client_uno 
      inner join hbm_persnl p on c.resp_empl_uno = p.empl_uno 
where p.login = @login 
    and c.status_code = 'C' 
    and ba.tran_type in ('CR', 'RA') 
group by ba.payr_client_uno 
order by ba.payr_client_uno 

--Obtain list of Transaction Date and Amount for the Transaction 
select 
    b.client_uno 
    , ba.tran_date 
    , ba.tc_total_amt 
from blt_bill_amt ba 
    inner join #Bills b on ba.row_uno = b.row_uno 

不太清楚发生了什么事情,但似乎在临时表不表现正确的。理想情况下,我将有246行数据,但使用先前的查询语法,它将产生400-5000行数据,显然是数据重复。

+0

我不认为这个问题是在这里。您在此处展示的内容只会为每个client_uno返回一个日期,因为您按该值进行分组。客户端名称中是否可以有空格,这看起来像是同一个客户端正在返回多个日期? –

+0

client_uno是唯一的'int'值,因此没有空格或错误值。该值在应用程序的后端进行控制。 – GoldBishop

+0

另一个需要注意的是,在某些情况下,当查看结果数据集时,某些client_uno具有CR&RA记录,而其他一些则具有双CR或RA记录,其余为单CR或RA值。现在你看到了问题,它并不总是返回一个价值回来,我可以把问题挂钩。除了我查询的client_uno之外,更多的问题不是很一致。 – GoldBishop

回答

2

我认为你可以使用排名来达到你想要什么:

WITH ranked AS (
    SELECT 
    client_uno = ba.payr_client_uno, 
    ba.tran_date, 
    be.tc_total_amt, 
    rnk = ROW_NUMBER() OVER (
     PARTITION BY ba.payr_client_uno 
     ORDER BY  ba.tran_uno DESC 
    ) 
    FROM blt_bill_amt ba 
    INNER JOIN hbm_matter m ON ba.matter_uno = m.matter_uno 
    INNER JOIN hbm_client c ON m.client_uno = c.client_uno 
    INNER JOIN hbm_persnl p ON c.resp_empl_uno = p.empl_uno 
    WHERE p.login = @login 
    AND c.status_code = 'C' 
    AND ba.tran_type IN ('CR', 'RA') 
) 
SELECT 
    client_uno, 
    tran_date, 
    tc_total_amt 
FROM ranked 
WHERE rnk = 1 
ORDER BY client_uno 

有用的书:

+0

我会尝试这一点,当回到客户端....不知道有一个SQL 2005的排名机制 – GoldBishop

+0

布拉沃安德烈......它暂时工作....等待验证。并感谢您的链接....我即将阅读这些文章进一步阅读。 – GoldBishop

+0

Andriy ....为什么我会收到这条消息“155级,155级,状态1,70行'mattranked'不是一个公认的GROUP BY选项。”在将Select语句转储到它自己的临时表之后....添加到#LastPay中。或者这是我无法做到的事情,我应该在最终查询时进行连接? – GoldBishop