2017-04-24 38 views
0

匹配不同的行值的差異我有它具有以下的表:SQL - 設置列值由共同的ID

// zip // date_qtr // vac_ratio // vac_change // 
100  12_2016  0.56   NULL 
101  12_2016  0.44   NULL 
100  9_2016  0.38   NULL 
.   .  . 
.   .  . 
101  9_2016  0.12   NULL 

我想找到vac_ratio的變化(對前幾個季度vac_ratio)爲每個郵編的每個季度。 所以基本上於與date_qtr => 12_2016

vac_change(新列)=表中的每一行(vac_ratio(12_2016和zip = Z1) - vac_ratio(9_2016和zip = Z1))/ vac_ratio(9_2016和拉鍊= z1)

我能夠使用JOIN獲得vac_change值,但我發現很難更新列vac_change。

UPDATE h0 SET h0.vac_change= a0.vac_change FROM hud_vacancies h0 JOIN 
(SELECT h1.zip,h1.date_qtr,((h1.vac_ratio - h2.vac_ratio)/h2.vac_ratio) AS vac_change 
FROM hud_vacancies h1 JOIN hud_vacancies h2 ON h1.zip = h2.zip 
WHERE h1.date_qtr LIKE '12_2016' and h2.zip LIKE '9_2016')a0 ON h0.zip = a0.zip WHERE h0.date_qtr LIKE '12_2016' 

我得到一個SQL語法錯誤,但我不明白是什麼問題。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM hud_vacancies h0 JOIN (SELECT h1.zip,h1.date_qtr,((h1.vac_ratio - h2.vac_r' at line 1 

我根據我的sql腳本類似於爲here的解決方案。 我希望問題清楚,如果需要更多信息,請告訴我。

編輯: 根據@Gordon給出的輸入,我嘗試了一個沒有FROM操作符的腳本變體。它現在不會給我一個語法錯誤,但它也不會設置列。列仍然是NULL,並且沒有行受到影響。這是修改後的代碼。

UPDATE hud_vacancies h0 
    JOIN 
    (SELECT h1.zip 
      , h1.date_qtr 
      , ((h1.vac_ratio - h2.vac_ratio)/h2.vac_ratio) vac_change 
     FROM hud_vacancies h1 
     JOIN hud_vacancies h2 
      ON h1.zip = h2.zip 
     WHERE h1.date_qtr LIKE '12_2016' 
      and h2.zip LIKE '9_2016' 
    ) a0 
    ON h0.zip = a0.zip 
    SET h0.vac_change = a0.vac_change 
WHERE h0.date_qtr LIKE '12_2016' 

PS:我很抱歉,因爲我知道標題中提到的區別,而我試圖計算的變化率,但我試圖保持一個通用的標題並沒有在執行差異計算的一個小的差異和變化率。

+0

MySQL不支持'UPDATE'語句中的'FROM'子句。 –

+0

請參閱http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-查詢 – Strawberry

+0

您使用了'SQL Server'語法。我想在'MySQL'中,你在'SET'之前加入'JOIN'。 – Eric

回答

0

我的查詢存在一個小錯誤,導致不更新任何行的問題。我正在應用where子句h2.zip LIKE'9_2016'而不是h2.date_qtr LIKE'9_2016'。

謝謝戈登,草莓和埃裏克你的意見。

這裏是更正的工作查詢。

UPDATE hud_vacancies h0 JOIN 
(SELECT h1.zip,h1.date_qtr,(h1.vac_ratio - h2.vac_ratio) AS vac_change 
FROM hud_vacancies h1 JOIN hud_vacancies h2 ON h1.zip = h2.zip 
WHERE h1.date_qtr LIKE '12_2016' and h2.date_qtr LIKE '9_2016') 
a0 ON h0.zip = a0.zip 
SET h0.vac_change= a0.vac_change WHERE h0.date_qtr LIKE '12_2016'