SQLite中的累积求和值

时间:2014-01-27 13:58:42

标签: sql sqlite

我正在尝试在SQLite中执行累积值。我最初只需要对一列进行求和并得到代码

SELECT
    t.MyColumn,
    (SELECT Sum(r.KeyColumn1) FROM MyTable as r WHERE r.Date < t.Date)
FROM MyTable as t

Group By t.Date;

工作得很好。

现在我想将其扩展到更多列KeyColumn2KeyColumn3。我没有添加更多SELECT语句,而是认为最好使用连接并编写以下内容

SELECT
    t.MyColumn,
    Sum(r.KeyColumn1),
    Sum(r.KeyColumn2),
    Sum(r.KeyColumn3)
FROM MyTable as t
Left Join MyTable as r On (r.Date < t.Date)

Group By t.Date;

然而,这并没有给出正确的答案(相反,它给出的值比预期的要大得多)。为什么会这样,我如何更正JOIN给我正确答案?

2 个答案:

答案 0 :(得分:2)

您很可能会得到我称之为迷你的内容 - Cartesian products:您的Date值可能不是唯一的,并且由于自我加入,您获得的是每个非 - 独特的价值观。按Date分组后,结果会相应地相乘。

要解决此问题,连接的左侧必须摆脱重复的日期。一种方法是从表中导出一个唯一日期表:

SELECT DISTINCT Date
FROM MyTable

并将其用作联接的左侧:

SELECT
    t.Date,
    Sum(r.KeyColumn1),
    Sum(r.KeyColumn2),
    Sum(r.KeyColumn3)
FROM (SELECT DISTINCT Date FROM MyTable) as t
Left Join MyTable as r On (r.Date < t.Date)
Group By t.Date;

我注意到您在SELECT子句中使用了t.MyColumn,而您的分组是t.Date。如果这是故意的,那么您可能依赖于未定义的行为,因为t.MyColumn值可能会在同一t.Date组中的(可能)多个中任意选择。

出于本示例的目的,我假设您实际上意味着t.Date,因此,我相应地替换了列,如上所示。如果我的假设不正确,请澄清。

答案 1 :(得分:0)

你的加入不起作用,因为他会找到更多的可能性加入,然后你的subselect会做。

联接正在爆炸你的桌子。

子选择执行所有记录的总和,其中日期低于当前记录中的日期。

只要日期低于当前记录,连接就会多次连接每一行。这意味着单个记录可以作为manny加入,因为有日期较低的记录。这会导致多条记录。而且到底有更高的SUM。

如果您想要多个列的总和,则必须使用3个子查询或定义唯一的连接。