有人可以解释的运行总计在本教程SQL自联接给我吗?
-
22-09-2019 - |
题
我正在读在这里教程: HTTP://www.1keydata .COM / SQL / SQL运行-totals.html ,这一切是有意义的,直到它突然起身时,它得到了排名,中位数,运行总计,等有人可以用简单的英语解释如何是非常可笑的令人难以置信的复杂查询结果在总运行?谢谢!
解决方案
在我开始之前,我从来没见过这个,它看起来并不像一个十分理解的方式来完成总运行。
好的,这是从教程查询:
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;
和所述采样输出
Name Sales Running_Total
Greg 50 50
Sophia 40 90
Stella 20 110
Jeff 20 130
Jennifer 15 145
John 10 155
此查询的简单部分显示每个雇员的销售数据。所有我们正在做的是从每个员工选择name
和sales
和销售金额(降序)进行排序。这为我们提供了我们的基地名单。
现在的运行总计,我们希望这已经显示每一行。所以,我们加入了对表本身,在将已经被显示每行:
WHERE a1.Sales <= a2.sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
然后,我们因此使用SUM
聚合函数和组。一个好办法理解这一点,如果你看一下,如果你没有使用组功能会发生什么。该“索菲亚”行应该是这样的:
Name A1.Sales A2.Sales
Sophia 40 50
Sophia 40 40
我们的通知是如何得到格雷格的销售行?该组将总结该起来,瞧!
希望有所帮助。乔
其他提示
在第一表连接到其自身时,加入导致的行的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
结果:
Name Sales Running_Total
Greg 50 50
Sophia 40 90
Stella 20 130 --note that two running totals are the same!
Jeff 20 130
Jennifer 15 145
John 10 155
鲍勃
我也得到相同的不正确的输出鲍勃上面所述运行总断裂下来斯特拉&杰夫,谁具有相同的销售数字。我使用SQL Server 2014管理Studio速成。我不认为该网站的解决方案实际上是正确的。我做基于名称,而不是对销售的加入,并与这些,它产生正确运行的总想出了:
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);
收率:
name sales running_total
Stella 20 20
Sophia 40 60
John 10 70
Jennifer 15 85
Jeff 20 105
Greg 50 155
你也可以做如下,如果你在一个不舒服的总排序的变种。它改变顺序,但运行总数仍然是正确的:
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
Greg 50 50
Jeff 20 70
Jennifer 15 85
John 10 95
Sophia 40 135
Stella 20 155