当“余额”表仅在余额更改的那些日期具有条目时,创建显示每天帐户余额的视图

时间:2013-09-30 07:43:32

标签: sql date join

我需要以特定方式加入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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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子查询匹配所有日期行,其中余额行的日期小于或等于相应的日期行,并且对于每个日期行,余额行的最大日期为i。即如果两个日期相等,则为最近的余额或当前余额。 外部主查询的目的是获取每个日期的相应金额。