基于两列的所有组合检索数据的有效方法是什么?

时间:2014-11-24 04:52:04

标签: mysql sql database

我在这里处理一个看似复杂的问题。不幸的是,我不是SQL的专家,所以我无法确定这个问题的有效,通用的解决方案。

要添加一些上下文,我正在处理MySQL表中的车辆崩溃数据。崩溃表具有以下属性:id,日期时间,发生的状态以及事故发生时汽车的天气和位置。天气和位置是数值,相应的描述在单独的表格中给出。

由于某些格式问题,我刚刚截取了我正在使用的示例表的截图。

崩溃数据表

Crash Data Table

天气描述表

Weather Descriptions Table

崩溃位置说明表

Crash Location Descriptions Table

我想获得每种天气和汽车位置组合的碰撞案例数量。例如,如果有8个天气条件和8个碰撞位置,那么我想得到64个结果与天气和&位置组合和该组合的死亡人数。

组合可能性

Combination Possibilities

目前我已尝试按顺序执行此操作,但速度太慢。以下是我目前正在处理的查询:

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合作,因此也可能会有该帐户的回复。

1 个答案:

答案 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

http://sqlfiddle.com/#!2/89693b/3/0