我在这里处理一个看似复杂的问题。不幸的是,我不是SQL方面的专家,因此我无法确定此问题的有效而通用的解决方案。
为了添加一些上下文,我正在使用MySQL表中的车辆崩溃数据。碰撞表具有以下属性:ID,日期时间,发生的状态以及事故发生时汽车的天气和位置。天气和位置是数字值,相应的描述在单独的表中给出。
由于某些格式问题,我刚刚拍摄了我正在使用的示例表的屏幕截图。
崩溃数据表
天气说明表
崩溃位置说明表
我想获取每种天气和汽车位置组合所导致的撞车事故数量。例如,如果有8个天气条件和8个坠机地点,那么我希望通过天气和地点组合以及该组合的死亡人数获得64个结果。
组合可能性
目前,我已尝试按顺序执行此操作,但速度太慢。这是我目前正在使用的查询:
SELECT locationDescriptionTable.type as Location,
weatherDescirptionTable.type as AtmCond,
count( c.casenum ) as Cases
FROM state AS stateTable,
data_all AS crashDataTable,
nm_location AS locationDescriptionTable,
atm_cond AS weatherDescirptionTable
WHERE crashDataTable.statenum = stateTable.id AND
crashDataTable.nmlocat = locationDescriptionTable.id AND
crashDataTable.atmcond = weatherDescirptionTable.id AND
locationDescriptionTable.id ="crashLocationName" AND
weatherDescirptionTable.id ="weatherConditionName"
我已经考虑了很多,使用JOINS或VIEWS将其分为不同的查询。但是我没有运气。任何帮助是极大的赞赏!
请尝试以下查询。您可能需要根据需要更改表和列的名称。内部查询将从您的位置和天气表中获取所有可能的组合,如果未找到匹配的Weather_ID和Location_ID,则左侧的Crash Data表联接将为您提供Crash Data表中列的空值。然后,您可以将其分组,并得到有零个空值和没有空个数的总和。
create table Weather(Weather_ID int, Type varchar(50));
create table Location(Location_ID int, Type varchar(50));
create table CrashData(Case_ID int, Weather_ID int, location_ID int);
insert into Weather(Weather_ID, Type)
values(1, 'Clear'), (2, 'Cloudy');
insert into Location(Location_ID, Type)
values(1, 'Intersection'), (2, 'Parking Lot');
insert into CrashData(Case_ID, Weather_ID, Location_ID)
values(1, 1, 1), (2, 1, 2), (3, 2, 1), (4, 2, 1);
SELECT Weather, Location, Sum(CASE WHEN Case_ID IS NULL THEN 0 ELSE 1 END) Number_Of_Cases
FROM (SELECT Weather.Weather_ID, Weather.Type Weather,
Location.Location_ID, Location.Type Location
FROM Weather, Location) Temp
LEFT OUTER JOIN CrashData
ON Temp.Weather_ID=CrashData.Weather_ID
AND Temp.Location_ID=CrashData.Location_ID
GROUP BY Weather, Location
ORDER BY Weather, Location
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句