我正在读在这里教程: 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

此查询的简单部分显示每个雇员的销售数据。所有我们正在做的是从每个员工选择namesales和销售金额(降序)进行排序。这为我们提供了我们的基地名单。

现在的运行总计,我们希望这已经显示每一行。所以,我们加入了对表本身,在将已经被显示每行:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top