2013-09-30 55 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