下表包含地名和距离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
答案 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
答案 1 :(得分:1)
首先,您必须将DBMS标记为sql-server
或oracle
这是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)
;