有人可以向我解释本教程中的运行总数和SQL自联接吗?

Phi*_*oum 1 sql self-join running-total

我在这里阅读了该教程:http : //www.1keydata.com/sql/sql-running-totals.html,这一切都是有意义的,直到排名,中位数和运行总计突然变得极其荒谬得令人难以置信地复杂等等。有人可以用简单的英语解释该查询如何产生连续的总数吗?谢谢!

Jos*_*tey 5

在开始之前,我以前从未见过这种方法,而且它看起来也不是实现运行总计的一种非常容易理解的方法。

好的,这是教程中的查询:

SELECT a1.Name, a1.Sales, SUM(a2.Sales) Running_Total
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales <= a2.sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name DESC;
Run Code Online (Sandbox Code Playgroud)

和样品输出

Name    Sales   Running_Total
Greg     50     50
Sophia    40    90
Stella    20    110
Jeff      20    130
Jennifer  15    145
John      10    155
Run Code Online (Sandbox Code Playgroud)

该查询的简单部分是显示每个员工的销售数据。我们要做的就是从每个员工中选择name并按sales销售额(降序)对其进行排序。这给出了我们的基本清单。

现在,对于运行总计,我们希望已经显示的每一行。因此,我们将表与自身连接起来,在已经显示的每一行上:

WHERE a1.Sales <= a2.sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
Run Code Online (Sandbox Code Playgroud)

然后,我们使用SUM聚合函数并进行相应分组。理解这一点的一个好方法是,如果您查看不使用group函数会发生什么。“ Sophia”行如下所示:

Name    A1.Sales    A2.Sales
Sophia  40          50
Sophia    40         40
Run Code Online (Sandbox Code Playgroud)

请注意我们是如何获得Greg的销售行的?该小组将对此进行总结,瞧!

希望能有所帮助。乔