2013-09-30 79 views
0

我有2個表,我需要以特定方式加入。 「日期」是一個簡單顯示1990年至2040年的單列表格。 「餘額」包含數百個銀行帳戶的餘額。訣竅:只有當賬戶餘額變化時,數據庫纔會在「餘額」中爲該賬戶創建一個新條目。一旦帳戶有新的餘額,就會創建一個新條目。在餘額保持不變的日子裏沒有條目。創建一個視圖,顯示每天的賬戶餘額,當「餘額」表只有在餘額變化的那些日子裏的條目時

現在我需要創建一個視圖,顯示每天所有帳戶的餘額。這意味着我必須顯示「日期」的日期和每個帳戶的相應餘額。當我加入這兩張表格時,在某一天,我只能看到當天發生變化的那些賬戶,我看不到沒有變化的賬戶餘額。我該如何解決?

「日期」

Date 

1.1.1990 
2.1.1990 
3.1.1990 

「平衡」

Date  Account  Balance 

    1.1.1990 1    100 
    1.1.1990 2    60 
    1.1.1990 3    0 
    2.1.1990 2    50 
    3.1.1990 1    150 

所需的結果

Date  Account  Balance 
    1.1.1990 1    100 
    1.1.1990 2    60 
    1.1.1990 3    0 
    2.1.1990 1    100 
    2.1.1990 2    50 
    2.1.1990 3    0 
    3.1.1990 1    150 
    3.1.1990 2    50 
    3.1.1990 3    0 
+0

您正在使用哪些DBMS? Postgres的?甲骨文?這可以通過使用窗口函數和「運行總和」來輕鬆完成。 –

回答

0

這將是更方便地提供更正確的查詢,如果你會爲提供描述表格和一些示例數據。不過,我覺得這個查詢會工作 - 它會從BALANCE返回最接近給定日期行:

SELECT * FROM DATES d, BALANCE b 
WHERE d.date >= b.date 
     AND b.date >= ALL (SELECT b1.date FROM BALANCE b1 
        WHERE b1.date <= d.date 
          AND b1.account = b.account) 

該查詢應提供所需的結果:

SELECT d.date, b.account, b.balance FROM DATES d, BALANCE b 
WHERE d.date >= b.date 
     AND b.date >= ALL (SELECT b1.date FROM BALANCE b1 
         WHERE b.account = b1.account 
           AND d.date >= b1.date) 
ORDER BY d.date, b.account 
+0

感謝您的回答。我添加了一些樣本數據和所需結果的樣本。 –

+0

@ user2463153編輯一個答案,新的查詢應該工作得很好。 – Mikhail

+0

你的答案似乎工作。你能向我解釋這個查詢背後的邏輯嗎? –

0

一個更簡潔的方法應爲以下內容,其中DATES是日期表,其中D爲日期屬性,BALANCE爲餘額表,其中BAL_DATE爲餘額日期和AMOUNT爲當前餘額的屬性:

SELECT SUB.D, B.AMOUNT 
FROM (
    SELECT D.D AS D,MAX(B.BAL_DATE) AS BD 
    FROM DATES D, BALANCE B 
    WHERE D.D>=B.BAL_DATE 
    GROUP BY D.D) AS SUB, BALANCE B 
WHERE SUB.BD = B.BAL_DATE 
ORDER BY SUB.D 

SUB子查詢匹配所有日期行,餘額行的日期小於或等於相應的日期行,並且對於每個日期行採用餘額行與max日期i。即如果兩個日期相等,則最近的餘額或當前的餘額。 外部主要查詢的目的是爲每個日期獲取相應的金額。

+0

謝謝。你的查詢比上面的查詢快得多,但結果不是我所需要的。我不知道爲什麼,但結果中缺少很多日期。 –

+0

那些從日期表或餘額日期開始的日期? – remigio