2301_78372205 2023-05-26 14:40 采纳率: 0%
浏览 26

用C#的winform中的datagridview做一个地铁票价图。现在想要输入两个站点,可以呈现出两站间的票价图。

例如输入起始站:机场东,终点站:西乡,呈现的效果如标注所示。请各位赐教!谢谢。

img

  • 写回答

1条回答 默认 最新

  • wanghui0380 2023-05-26 15:42
    关注

    这个叫数据透视表,其实更专业的叫法是邻接矩阵表

    我个人建议呢,你直接查询数据库的时候就转置成邻接表把,这样你外面就是简单的绑定。
    代码呢,我就直接让chartgpt写了

    以下是chargpt的回复

    在 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 操作,以保证输出结果包含所有站点,即使某些站点没有边与之相连。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月26日