2013-12-20 132 views
2

我有一個問題根據SQL。數據庫是Firebird,但不應該太重要,因爲我希望儘可能使用ANSI標準。根據其他表格中的兩個日期選擇值?

我必須根據用戶資格和用戶分配該資格的日期(我希望這聽起來正確)選擇費率。我有看起來像這樣的表:

Usertable Variables  Qualification Rapportcostrate Timeaccount 
========= =========  ============= =============== =========== 
UserId  VarId   QuaId   RcrId    TiaID 
UserName VarUserId  QuaName   RcrName   TiaValue 
      VarQuaId  QuaRcrId   RcrRate   TiaDate 
      VarValidFrom          TiaUserId 

我現在需要得到的是這樣的:

UserName, RcrRate, TiaValue, TiaDate 

我的問題是資格隨時可能發生變化,但如之前進入資格可能仍然有效。這應該在

RcrRate * TiaValue 

基於在VarValidFromTiaDate值計算(或選擇)。我不能把它們放在一起! :-(

難道我讓自己清楚了嗎?我希望如此!請隨時隨時提問!

==編輯20h後==

我使用這個SQL命令此刻:

SELECT RcrRate, VarValidFrom, TiaValue FROM USERTABLE 
    JOIN VARIABLES ON UserId = VarUserId 
    JOIN QUALIFICATIONS ON VarQuaId = QuaId 
    JOIN RAPPORTCOSTRATE ON QuaRcrId = RcrId 
    JOIN TIMEACCOUNT ON UserId = TiaUserId 
WHERE UserId = XYZ 

現在讓我們假設表資格充滿了幾套

Qualifications   Rapportcostrate 
===============   =============== 
1 Dummy 1   1 Value01 20 
2 Testing 2   2 Value02 30 
3 Another 3   3 Value03 40 
4 FooBar 4   4 Value04 50 

如果用戶XYZ在Variables三個條目像

Variables 
========= 
1 1 1 2008-03-01 
2 1 2 2009-04-01 
3 1 3 2010-05-10 
4 1 4 2013-12-12 

預期的結果應該返回適​​合VarValidFrom日至TiaDateRcrRate。我想每TiaDate只收到一行。

...這是相當努力,讓自己清楚...... ;-)

+0

請發表一下你的代碼 –

+1

顯示你已經嘗試了什麼,並對預期結果更具體。 –

回答

0

這有多種解決方案,下面我用的CTE(公共表表達式)的解決方案將拆分邏輯工作單位。 cteVarTimes選擇VariablesTimeaccount的所有有效組合,然後cteMostRecent爲用戶選擇最新的組合。在主選擇中,我將它與來自QualificationsRapportcostrate的信息結合起來。

如果您需要能夠爲所有用戶返回行,則此解決方案不起作用。在這種情況下,您需要用一個查詢替換cteMostRecent,該查詢使用每個用戶的最大組數VarValidFromTiaDate來選擇行。

WITH cteVarTimes AS ( 
    SELECT v.VarUserId as UserId, v.VarQuaId, tia.TiaValue, tia.TiaDate, v.VarValidFrom 
    FROM Variables v 
    INNER JOIN Timeaccount tia 
     ON tia.TiaUserId = v.VarUserId 
    WHERE tia.TiaDate >= v.VarValidFrom 
), 
cteMostRecent AS (
    SELECT UserId, VarQuaId, TiaValue, VarValidFrom 
    FROM cteVarTimes 
    WHERE UserId = 1 -- Parameter in real use 
    ORDER BY VarValidFrom DESC, TiaDate DESC 
    ROWS 1 
) 
SELECT RcrRate, TiaValue, VarValidFrom 
FROM cteMostRecent a 
INNER JOIN Qualifications q 
    ON q.QuaId = a.VarQuaId 
INNER JOIN Rapportcostrate rcr 
    ON rcr.RcrId = q.QuaRcrId 
+0

親愛的馬克,我目前不在我可以測試這個命令的地方,但是我想問一下,即使在VarValidFrom日期之前有TiaDates,或者如果這隻會返回最近的那個,它是否會返回正確的RcrRate RcrRate? – cico

+0

@cico在'cteMostRecent'中,我通過recency('ORDER BY VarValidFrom DESC,TiaDate DESC')命令結果,並且只選擇第一個('ROWS 1')。但是,我的查詢完全可能不會完全滿足您的需求(它爲每個用戶選擇一行,而不是每個TiaDate)),但我希望它能爲您提供足夠的信息。 –

+0

無論如何......聖誕快樂! ;-) – cico

相關問題