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
4

2 回答 2

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
于 2013-09-30T08:07:37.233 回答
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 子查询将所有日期行与日期小于或等于相应日期行的余额行匹配,并且对于每个日期行,获取具有最大日期的余额行,即最近的余额或如果两个日期相等则为当前余额。外部主查询的目的是获取每个日期对应的金额。

于 2013-09-30T08:47:55.673 回答