SQL 支付矩阵
SQL payments matrix
我想把两个table合二为一:
第一个table:付款
id | 2010_01 | 2010_02 | 2010_03
1 | 3.000 | 500 | 0
2 | 1.000 | 800 | 0
3 | 200 | 2.000 | 300
4 | 700 | 1.000 | 100
第二个table是ID和一些日期(每个ID都不一样)
id | date |
1 | 2010-02-28 |
2 | 2010-03-01 |
3 | 2010-01-31 |
4 | 2011-02-11 |
我想要实现的是创建 table,其中包含 ID table 中日期之前的所有付款,以创建如下内容:
id | date | T_00 | T_01 | T_02
1 | 2010-02-28 | 500 | 3.000 |
2 | 2010-03-01 | 0 | 800 | 1.000
3 | 2010-01-31 | 200 | |
4 | 2010-02-11 | 1.000 | 700 |
其中T_00表示与'date'值同月付款,T_01上月付款等。
有办法吗?
编辑:
我正在尝试在 MS Access 中实现这一点。
问题是我无法将第一列 table 的名称与第二列的日期联系起来(最简单的方法是将其视为变量)
我在第二个 (ID) table 的 T_24 列中添加了 T_00 并尝试更新这些字段
set T_00 =
iif(year(date)&"_"&month(date)=2010_10,
但我意识到,如果我想为每个付款期和每个 T_xx 列都执行此操作,那么要处理的代码太多了。
即使我为 T_00 编写代码,我也必须在接下来的 23 个周期中重复它。
您的 Payments
table 是反规范化的。这些日期列是重复组,这意味着您违反了第一范式 (1NF)。这特别困难,因为您的字段名称实际上是数据。正如您所发现的那样,当您想要将 table 与其他内容相关联时,重复分组完全是一件令人头疼的事情。这就是为什么 1NF 如此重要,但知道它并不能解决您的问题。
您可以通过创建一个联合您的 Payments
table.
的视图来规范化您的数据
像这样:
CREATE VIEW NormalizedPayments (id, Year, Month, Amount) AS
SELECT id,
2010 AS Year,
1 AS Month,
2010_01 AS Amount
FROM Payments
UNION ALL
SELECT id,
2010 AS Year,
2 AS Month,
2010_02 AS Amount
FROM Payments
UNION ALL
SELECT id,
2010 AS Year,
3 AS Month,
2010_03 AS Amount
FROM Payments
如果你有更多,依此类推。这就是付款 table 最初应该设计的方式。
使用值为“2010-01-01”的日期字段可能比使用年和月字段更容易。这取决于你的数据。您可能还想将 WHERE Amount IS NOT NULL
添加到 UNION 中的每个查询,或者您可能想使用 Nz(2010_01,0.000) AS Amount
。同样,这取决于您的数据和其他查询。
我很难理解你是如何从这里加入的,尤其是 id
字段之间的关系,因为我看不到它们如何处理所提供的少量数据,所以我会提供一些关于下一步做什么的一般想法。
接下来,您可以使用 method similar to this or a method similar to this. To actually produce the result you want, include a calculated field in this view with the difference in months. Then, create an actual Pivot Table to format your results (like this or like this 将您的第二个 table 与此规范化付款 table 结合起来,这是显示数据的正确方式,就像您的 table 所做的那样.
我想把两个table合二为一:
第一个table:付款
id | 2010_01 | 2010_02 | 2010_03
1 | 3.000 | 500 | 0
2 | 1.000 | 800 | 0
3 | 200 | 2.000 | 300
4 | 700 | 1.000 | 100
第二个table是ID和一些日期(每个ID都不一样)
id | date |
1 | 2010-02-28 |
2 | 2010-03-01 |
3 | 2010-01-31 |
4 | 2011-02-11 |
我想要实现的是创建 table,其中包含 ID table 中日期之前的所有付款,以创建如下内容:
id | date | T_00 | T_01 | T_02
1 | 2010-02-28 | 500 | 3.000 |
2 | 2010-03-01 | 0 | 800 | 1.000
3 | 2010-01-31 | 200 | |
4 | 2010-02-11 | 1.000 | 700 |
其中T_00表示与'date'值同月付款,T_01上月付款等。
有办法吗?
编辑: 我正在尝试在 MS Access 中实现这一点。
问题是我无法将第一列 table 的名称与第二列的日期联系起来(最简单的方法是将其视为变量)
我在第二个 (ID) table 的 T_24 列中添加了 T_00 并尝试更新这些字段
set T_00 =
iif(year(date)&"_"&month(date)=2010_10,
但我意识到,如果我想为每个付款期和每个 T_xx 列都执行此操作,那么要处理的代码太多了。
即使我为 T_00 编写代码,我也必须在接下来的 23 个周期中重复它。
您的 Payments
table 是反规范化的。这些日期列是重复组,这意味着您违反了第一范式 (1NF)。这特别困难,因为您的字段名称实际上是数据。正如您所发现的那样,当您想要将 table 与其他内容相关联时,重复分组完全是一件令人头疼的事情。这就是为什么 1NF 如此重要,但知道它并不能解决您的问题。
您可以通过创建一个联合您的 Payments
table.
像这样:
CREATE VIEW NormalizedPayments (id, Year, Month, Amount) AS
SELECT id,
2010 AS Year,
1 AS Month,
2010_01 AS Amount
FROM Payments
UNION ALL
SELECT id,
2010 AS Year,
2 AS Month,
2010_02 AS Amount
FROM Payments
UNION ALL
SELECT id,
2010 AS Year,
3 AS Month,
2010_03 AS Amount
FROM Payments
如果你有更多,依此类推。这就是付款 table 最初应该设计的方式。
使用值为“2010-01-01”的日期字段可能比使用年和月字段更容易。这取决于你的数据。您可能还想将 WHERE Amount IS NOT NULL
添加到 UNION 中的每个查询,或者您可能想使用 Nz(2010_01,0.000) AS Amount
。同样,这取决于您的数据和其他查询。
我很难理解你是如何从这里加入的,尤其是 id
字段之间的关系,因为我看不到它们如何处理所提供的少量数据,所以我会提供一些关于下一步做什么的一般想法。
接下来,您可以使用 method similar to this or a method similar to this. To actually produce the result you want, include a calculated field in this view with the difference in months. Then, create an actual Pivot Table to format your results (like this or like this 将您的第二个 table 与此规范化付款 table 结合起来,这是显示数据的正确方式,就像您的 table 所做的那样.