我正在尝试在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;
工作得很好。
现在我想将其扩展到更多列KeyColumn2
和KeyColumn3
。我没有添加更多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
给我正确答案?
答案 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个子查询或定义唯一的连接。