有人能给我解释一下本教程中运行的total和SQL自连接吗?

有人能给我解释一下本教程中运行的total和SQL自连接吗?,sql,self-join,cumulative-sum,Sql,Self Join,Cumulative Sum,我在这里阅读了教程:这一切都是有意义的,直到它突然变得极其可笑,难以置信的复杂,当它涉及到排名,中位数,运行总数,等等。有人能用简单的英语解释一下,查询是如何产生运行总数的吗?谢谢 在我开始之前,我以前从未见过这一点,而且它看起来不像是一种非常容易理解的方式来完成一个连续的总数 好的,下面是教程中的查询: SELECT a1.Name, a1.Sales, SUM(a2.Sales) Running_Total FROM Total_Sales a1, Total_Sales a2 WHERE

我在这里阅读了教程:这一切都是有意义的,直到它突然变得极其可笑,难以置信的复杂,当它涉及到排名,中位数,运行总数,等等。有人能用简单的英语解释一下,查询是如何产生运行总数的吗?谢谢

在我开始之前,我以前从未见过这一点,而且它看起来不像是一种非常容易理解的方式来完成一个连续的总数

好的,下面是教程中的查询:

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;
此查询的简单部分是显示每个员工的销售数据。我们所做的只是从每位员工中选择姓名和销售额,然后按销售额降序排列。这是我们的基本清单

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

WHERE a1.Sales <= a2.sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
注意我们是如何得到格雷格的销售记录的吗?小组将总结这些,瞧


希望有帮助。乔

在我开始之前,我以前从未见过这种方法,而且它看起来也不像是一种非常容易理解的方法来完成一个跑步总数

好的,下面是教程中的查询:

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;
此查询的简单部分是显示每个员工的销售数据。我们所做的只是从每位员工中选择姓名和销售额,然后按销售额降序排列。这是我们的基本清单

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

WHERE a1.Sales <= a2.sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
注意我们是如何得到格雷格的销售记录的吗?小组将总结这些,瞧


希望有帮助。Joe

第一个表连接到它自己,连接结果是x行数,其中x是总销售额低于它自己的行数,或者行中的名称相同,即按销售额排序时,我们正在查看的行之前的所有销售


然后,它在联接左侧的字段上分组,并对我们联接到的行求和,从而得到一个运行总数。要查看它的工作方式,您可能希望在不使用求和和和分组的情况下运行它,以查看返回的原始结果。

第一个表连接到它自身,连接产生x个行数,其中x是总销售额低于它自身的行数,或者行中的名称相同,即当按销售金额订购时,我们正在查看的行之前的所有销售


然后,它在联接左侧的字段上分组,并对我们联接到的行求和,从而得到一个运行总数。要查看它是如何工作的,您可能需要在没有求和和和分组的情况下运行它,以查看返回的原始结果。

上面的SQL在Sybase ASE 15上给出了不同的结果。我认为原因是“订单依据”直到显示时间才应用。以下是SQL和结果:

drop table Total_Sales
go
create table Total_Sales
(
    Name char(15),
    Sales  int
)

INSERT INTO Total_Sales VALUES( 'John', 10 )
INSERT INTO Total_Sales VALUES( 'Jennifer', 15)
INSERT INTO Total_Sales VALUES('Stella', 20 )
INSERT INTO Total_Sales VALUES('Sophia', 40 )
INSERT INTO Total_Sales VALUES('Greg', 50 )
INSERT INTO Total_Sales VALUES('Jeff', 20 )

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

Bob

上面的SQL在Sybase ASE 15上给出了不同的结果。我认为原因是“订单依据”直到显示时间才应用。以下是SQL和结果:

drop table Total_Sales
go
create table Total_Sales
(
    Name char(15),
    Sales  int
)

INSERT INTO Total_Sales VALUES( 'John', 10 )
INSERT INTO Total_Sales VALUES( 'Jennifer', 15)
INSERT INTO Total_Sales VALUES('Stella', 20 )
INSERT INTO Total_Sales VALUES('Sophia', 40 )
INSERT INTO Total_Sales VALUES('Greg', 50 )
INSERT INTO Total_Sales VALUES('Jeff', 20 )

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

Bob

我也得到了与上面Bob相同的错误输出,其中Stella&Jeff的总销售额出现了故障,他们的销售额相同。我正在使用SQL Server 2014 Management Studio Express。我认为该网站的解决方案实际上并不正确。我根据姓名而不是销售额进行了加入,并得出了以下结论,从而得出了正确的运行总数:

select a1.name
, a1.sales
, sum(a2.sales) 'running_total'
from #total_sales a1
inner join #total_sales a2 on a1.name <= a2.name 
group by a1.name, a1.sales
order by sum(a2.sales);
如果对聚合排序感到不舒服,也可以执行下面的变体。它改变了顺序,但运行总数仍然正确:

select a1.name
, a1.sales
, sum(a2.sales) 'running_total'
from #total_sales a1
inner join #total_sales a2 on a1.name >= a2.name 
group by a1.name, a1.sales
order by a1.name;
收益率:

name      sales  running_total
Stella    20     20
Sophia    40     60
John      10     70
Jennifer  15     85
Jeff      20     105
Greg      50     155
name     sales  running_total
Greg     50     50
Jeff     20     70
Jennifer 15     85
John     10     95
Sophia   40     135
Stella   20     155

我还得到了与上面Bob相同的错误输出,其中Stella&Jeff的运行总数出现了故障,他们有相同的销售数字。我正在使用SQL Server 2014 Management Studio Express。我认为该网站的解决方案实际上并不正确。我根据姓名而不是销售额进行了加入,并得出了以下结论,从而得出了正确的运行总数:

select a1.name
, a1.sales
, sum(a2.sales) 'running_total'
from #total_sales a1
inner join #total_sales a2 on a1.name <= a2.name 
group by a1.name, a1.sales
order by sum(a2.sales);
如果对聚合排序感到不舒服,也可以执行下面的变体。它改变了顺序,但运行总数仍然正确:

select a1.name
, a1.sales
, sum(a2.sales) 'running_total'
from #total_sales a1
inner join #total_sales a2 on a1.name >= a2.name 
group by a1.name, a1.sales
order by a1.name;
收益率:

name      sales  running_total
Stella    20     20
Sophia    40     60
John      10     70
Jennifer  15     85
Jeff      20     105
Greg      50     155
name     sales  running_total
Greg     50     50
Jeff     20     70
Jennifer 15     85
John     10     95
Sophia   40     135
Stella   20     155