SQL按站点和发车时间统计旅客总数结果错误该如何解决
错误原因
- 关联条件缺失导致笛卡尔积:当前SQL仅通过StationID关联三个表,未将客户信息表的旅客数据和所属的发车班次绑定,同一个站点下的所有发车时间记录会和该站点所有年龄组的旅客数据全匹配,数据被错误翻倍。
- 统计逻辑错误:由于笛卡尔积的影响,求和时会把同一个站点所有班次的旅客人数全部累加,而非按班次单独统计,导致总人数计算错误,同时也会出现重复的分组结果。
修正方法
- 补充表关联条件:客户信息表除了关联站点ID外,还需要和发车班次表的唯一标识(可以是发车班次主键,也可以是站点+发车时间的联合条件)关联,确保每条旅客数据仅匹配到所属的发车班次。
- 明确求和字段来源,避免字段歧义。
修正后SQL示例(假设客户信息表存储了对应发车时间字段)
SELECT TS.StationID, DD.[Time of Departure], SUM(CI.[Amount of travellers]) AS Amount FROM Train_Stations AS TS INNER JOIN DepartureData AS DD ON DD.FK_StationID = TS.PK_StationID INNER JOIN CustomerInfo AS CI ON CI.FK_StationID = TS.PK_StationID AND CI.[Time of Departure] = DD.[Time of Departure] GROUP BY TS.StationID, DD.[Time of Departure]
如果发车班次表有独立的主键PK_DepartureID,客户信息表有对应外键FK_DepartureID,也可以用主键关联,性能更优:
SELECT TS.StationID, DD.[Time of Departure], SUM(CI.[Amount of travellers]) AS Amount FROM Train_Stations AS TS INNER JOIN DepartureData AS DD ON DD.FK_StationID = TS.PK_StationID INNER JOIN CustomerInfo AS CI ON CI.FK_DepartureID = DD.PK_DepartureID GROUP BY TS.StationID, DD.[Time of Departure]
内容的提问来源于stack exchange,提问作者Mettepen
相关产品推荐
相关产品推荐

