2014-11-24 19 views
-1

我正在處理一個看似複雜的問題。不幸的是,我不是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" 

我已經想過這個了很多,使用加入或意見,這個分離出到不同的查詢。但是我沒有運氣。任何幫助是極大的讚賞!

另外,我正在與user: srr合作,所以可能會有來自該帳戶的回覆。

+3

CROSS JOIN ...... – 2014-11-24 04:55:22

回答

0

嘗試下面的查詢。您可能需要根據需要更改表格和列名稱。內部查詢從您的位置和天氣表中獲取所有可能的組合,如果未找到匹配的Weather_ID和Location_ID,則使用「碰撞數據」表的左連接將爲「碰撞數據」表的列提供空值。然後,您可以對它進行分組,並獲得多少空缺和多少空缺的總和。

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

+0

啊,這似乎正是我一直在尋找。令人驚訝的是,它不會對性能造成太大的影響(大約0.47秒在大約4000個表格上運行)。感謝您的幫助,並花時間在sqlfiddle中創建此查詢!我會更多地關注這個和LEFT OUTER JOIN。 – KrispyDonuts 2014-11-25 05:20:27

+0

我很高興它有幫助。 – Sudeep 2014-11-26 04:36:44

相關問題