2015-03-24 96 views
-1

我在寫一個查詢來總結OD矩陣表中的次數行程時遇到問題。對於使用MS Access以外的數據庫,我還是個新手,所以請原諒我的經驗不足。 SMGZ是帶有區域數量的表格,matrix_od是矩陣表格,其中所有OD對(4109 * 4109)從區域到區域以及總體行程類型數量。我不確定這是編寫此查詢的最佳方式。所以我需要做的就是根據OD總結4種類型的旅行(LHDT,MHDT,HHDT,HDT_Tota)。非常感謝幫助。POSTGRES Group/Inner Join

SELECT 
    smgz.smg_zone AS "O_ID", 
    smgz.x AS "O_X", 
    smgz.y AS "O_Y", 
    smgz1.smg_zone AS "D_ID", 
    smgz1.x AS "D_X", 
    smgz1.y AS "D_Y", 
    SUM(matrix_od."LHDT") AS "LHDT_Tot", 
    SUM(matrix_od."MHDT") AS "MHDT_Tot", 
    SUM(matrix_od."HHDT") AS "HHDT_Tot", 
    SUM(matrix_od."TOT_HDT") AS "HDT_Tot" 
FROM 
    public.smgz, 
    public.matrix_od, 
    public.smgz smgz1 
GROUP BY 
    "O_ID","O_X","O_Y","D_ID","D_X","D_Y" 
INNER JOIN 
    smgz on matrix_od.O_ID = smgz.ID 
INNER JOIN 
    smgz1 on matrix_od.D_ID = smgz1.ID; 


ERROR: syntax error at or near "INNER" 
LINE 18: INNER JOIN 
     ^

********** Error ********** 

ERROR: syntax error at or near "INNER" 
SQL state: 42601 
Character: 414 
+2

連接應該在GROUP BY之前。另外,您正在執行相當笛卡爾產品 – Lamak 2015-03-24 21:42:45

+1

您正在混合隱式連接語法和顯式'JOIN'運算符。不要這樣做。 – 2015-03-24 21:48:46

回答

1

正如評論(FROM子句中的多個表)有明確規定的兩個主要錯誤是,group by條款是在錯誤的地方,它應該是在加入之後,那你混合隱加入加入(使用join關鍵字)。解決方法是改變這一部分:

FROM 
    public.smgz, 
    public.matrix_od, 
    public.smgz smgz1 
GROUP BY 
    "O_ID","O_X","O_Y","D_ID","D_X","D_Y" 
INNER JOIN 
    smgz on matrix_od.O_ID = smgz.ID 
INNER JOIN 
    smgz1 on matrix_od.D_ID = smgz1.ID; 

這樣:

FROM 
    public.matrix_od 
INNER JOIN 
    public.smgz on matrix_od.O_ID = smgz.ID 
INNER JOIN 
    public.smgz smgz1 on matrix_od.D_ID = smgz1.ID 
GROUP BY 
    "O_ID","O_X","O_Y","D_ID","D_X","D_Y"; 
+0

這給我一個錯誤smgz1只是smgz的別名ERROR:ERROR:關係「smgz1」不存在 LINE 17:smgz1 on matrix_od。「D_ID」= smgz1。「id」 ^ ****** ****錯誤********** 錯誤:關係「smgz1」不存在 SQL狀態:42P01 字符:394 – aconti74 2015-03-24 22:27:04

+0

@ aconti74我的不好,忘了在連接中添加別名。更新了答案。 – jpw 2015-03-24 22:27:58

0

這奏效了!謝謝@a_horse_with_no_name & @Lamak。

SELECT 
    smgz.smg_zone AS "O_ID", 
    smgz.x AS "O_X", 
    smgz.y AS "O_Y", 
    smgz1.smg_zone AS "O_ID", 
    smgz1.x AS "D_X", 
    smgz1.y AS "D_Y",  
    SUM(matrix_od."LHDT") AS "LHDT_Tot", 
    SUM(matrix_od."MHDT") AS "MHDT_Tot", 
    SUM(matrix_od."HHDT") AS "HHDT_Tot", 
    SUM(matrix_od."TOT_HDT") AS "HDT_Tot" 
FROM 
    public.matrix_od 
INNER JOIN 
    smgz on matrix_od."O_ID" = smgz."id" 
INNER JOIN 
    public.smgz smgz1 on matrix_od."D_ID" = smgz1."id" 
GROUP BY 
    smgz.smg_zone,smgz.x,smgz.y,smgz1.smg_zone,smgz1.x,smgz1.y;