SQL - 将列值设置为与common id匹配的不同行的值的差值

时间:2017-04-24 16:48:43

标签: mysql sql

我有一个表格,其中包含以下列:

 // 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和zip = 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:我道歉,因为我知道标题提到了差异,而我正在尝试计算变化率,但我试图保持一个通用的标题,并且在计算差异和变化率方面存在一点差异

1 个答案:

答案 0 :(得分:0)

我的查询中出现了一个小错误,导致不更新任何行的问题。我正在应用where子句h2.zip LIKE' 2016年'而不是h2.date_qtr LIKE' 9_2016'。

感谢Gordon,Strawberry和Eric的投入。

以下是更正的工作查询。

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'
相关问题