【问题标题】:Understanding Self Join with function in SQL Server了解 SQL Server 中的自联接功能
【发布时间】:2014-09-18 11:03:19
【问题描述】:

谁能帮我理解我的查询?我知道这是正确的,但不知何故我不知道我是如何得出这个结果的。

查询:

Select 
    A.Name, A.Age, SUM(B.Age) Running_Total
from 
    infoTbl  A, infoTbl B 
Where 
    A.Age <= B.Age 
Group By 
    A.Name, A.Age
Order By 
    A.Age Desc 

结果:

Name    Age   Running Total
---------------------------
A        25        25
B        20        45
C        18        63
D        15        78
E        1         79
F        5         84

什么意思

Where A.Age <= B.Age

你能给我一个插图吗?非常感谢。

【问题讨论】:

  • 我看到你得到年龄的总和,等于或小于当前年龄。换句话说,当前和所有以前年龄的总和。
  • 是按行分组的吗?
  • 是的,如果我理解正确的话......
  • 是的,先生,我明白了,但比较从哪里开始?
  • 你原来的查询和结果不匹配

标签: sql-server self-join cumulative-sum


【解决方案1】:

让我们将您的查询分解为多个步骤

1.

Select 
    A.Name, A.Age, b.Name as bName, B.Age as bAge
from 
    infoTbl  A, infoTbl B 
Where 
    A.Age <= B.Age 
Order By 
    A.Age desc, B.Age

相当于

Select 
    A.Name, A.Age, b.Name as bName, B.Age as bAge
from 
    infoTbl  A
    inner join infoTbl B on A.Age <= B.Age 
Order By 
    A.Age desc, B.Age

这将为您提供:对于表 A 中的每条记录,B 中具有相同或更高年龄的记录。

Name    Age   bName   bAge
---------------------------
A        25    A       25
B        20    B       20
B        20    A       25
C        18    C       18
C        18    B       20
C        18    A       25
...
etc...

当您现在将 sum 和 group 按您得到的内容添加时,即年龄等于 a.age 或更大的人的总年龄

Select 
    A.Name, A.Age, SUM(B.Age) AS Running_Total
from 
    infoTbl  A
    inner join infoTbl B on A.Age <= B.Age
group by
    A.Name, A.Age 
Order By 
    A.Age desc



Name    Age   Running Total
---------------------------
A        25        25          (25)
B        20        45          (20 + 25 which is age of B+A)
C        18        63          (18 + 20 + 25 which is age of C+B+A)

【讨论】:

    【解决方案2】:

    Where A.Age&gt;=B.Age 获取您要添加的下一行。

    你可以用这个代替自加入

    select *,sum(Age)over(order by Name) as Running_Total from table
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多