我在这里处理一个看似复杂的问题。不幸的是,我不是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将其分成不同的查询。但是我没有运气。任何帮助是极大的赞赏!
另外,我正在与user: srr合作,因此也可能会有该帐户的回复。
答案 0 :(得分:0)
尝试以下查询。您可能希望根据需要更改表和列名称。内部查询从您的位置和天气表获得所有可能的组合,如果找不到匹配的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