2011-10-14 57 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