将别人的行值加到sql中的行

时间:2018-07-08 06:35:07

标签: sql sql-server select

下表包含地名和距离KM,该行在上一行要放置的行之间具有KM,即位置B的KM从A到B,c的KM从B   我想在SQL中找到每个地方到每个地方的总距离

Place   Distane in KM
A --->  0
B --->  80
C --->  90
D --->  100

我想将结果打印为

Place   --->  To    --->  Distane in KM 
A --->  B   --->  80
A   --->  C --->  170
A   --->  D --->  270
B   --->  C --->  90
B   --->  D --->  190
C   --->  D --->  100

2 个答案:

答案 0 :(得分:2)

您可以在目标大于源的行上自联接表,并使用sum的窗口变体:

SELECT   src.place + '->' + dst.place, 
         SUM(dst.distance) OVER (PARTITION BY src.place ORDER BY dst.place)
FROM     distances src
JOIN     distances dst ON src.place < dst.place
ORDER BY 1, 2

SQLFiddle

答案 1 :(得分:1)

首先,您必须将DBMS标记为sql-serveroracle


这是sql-server版本的演示,并结合使用row_number function和您的订单逻辑-> cross join self-> sum distance

with CTE as (
  select *,row_number() over (order by [Place]) rnk
  from T
)
select t1.Place + '->' + t2.Place as Place
  ,(select sum(Distane) from CTE t3 where t3.rnk > t1.rnk and t3.rnk <= t2.rnk  ) distance
from CTE t1,CTE t2
where t2.rnk > t1.rnk
order by Place

结果:

| Place | distance |
|-------|----------|
|  A->B |       80 |
|  A->C |      170 |
|  A->D |      270 |
|  B->C |       90 |
|  B->D |      190 |
|  C->D |      100 |

测试DDL:

CREATE TABLE T
    ([Place] varchar(1), [Distane] int)
;

INSERT INTO T
    ([Place], [Distane])
VALUES
    ('A', 0),
    ('B', 80),
    ('C', 90),
    ('D', 100)
;

Test DEMO