例如输入起始站:机场东,终点站:西乡,呈现的效果如标注所示。请各位赐教!谢谢。
这个叫数据透视表,其实更专业的叫法是邻接矩阵表
我个人建议呢,你直接查询数据库的时候就转置成邻接表把,这样你外面就是简单的绑定。
代码呢,我就直接让chartgpt写了
在 MSSQL 中,可以使用 T-SQL 的 PIVOT 操作和子查询来将表格数据按照邻接矩阵的形式输出。以下是示例代码:
假设数据表叫做 subway_edges,包含字段 start_station, end_station 和 cost,分别表示起点、终点和票价。
sql
SELECT * FROM subway_edges;
输出类似于以下形式的表格:
start_station | end_station | cost
--------------+-------------+-----
A | B | 2
A | C | 3
B | C | 1
B | D | 6
C | D | 2
现在要将此表格转换为邻接矩阵的形式:
A B C D
A - 2 3 -
B 2 - 1 6
C 3 1 - 2
D - 6 2 -
可以使用以下 SQL 语句来实现:
sql
-- 获取所有站点的列表,用于构建邻接矩阵
WITH stations AS (
SELECT start_station AS station FROM subway_edges
UNION
SELECT end_station AS station FROM subway_edges
)
-- 构建邻接矩阵并填充数据
SELECT
pivot_matrix.station AS [ ],
ISNULL([A], '-') AS [A],
ISNULL([B], '-') AS [B],
ISNULL([C], '-') AS [C],
ISNULL([D], '-') AS [D]
FROM (
-- 将数据表转换为适合进行 PIVOT 操作的形式
SELECT start_station, end_station, cost FROM subway_edges
) AS pivot_source
-- 使用 PIVOT 操作将行转换为列
PIVOT (MIN(cost) FOR end_station IN ([A], [B], [C], [D])) AS pivot_table
-- 合并所有站点列表和邻接矩阵
RIGHT JOIN (
SELECT station FROM stations
) AS pivot_matrix ON pivot_matrix.station = pivot_source.start_station
ORDER BY pivot_matrix.station;
在上述 SQL 语句中,子查询 stations 用来获取所有站点列表。然后,使用 PIVOT 操作将数据表转换为邻接矩阵的形式,并填充每个格子的值。最后,再与所有站点列表进行 RIGHT JOIN 操作,以保证输出结果包含所有站点,即使某些站点没有边与之相连。