在Mysql中通过Clause更新组

时间:2017-12-13 03:42:20

标签: mysql sql group-by sql-update

我有这个Employee_Detail表,看起来像下面的

 ID| EMP_NO| EMP_NAME| YEARMONTH| CURR_MTH_PAY_AMT| TOTAL_CURR_MTH_PAY_AMT| CURR_MTH_DED_AMT| TOTAL_CURR_MTH_DED_AMT
  1| 1      | 'Alan'  | 201712   | 100             | NULL                  |  50             | NULL
  2| 1      | 'Alan'  | 201712   | 200             | NULL                  |  70             | NULL
  3| 1      | 'Alan'  | 201712   | 300             | NULL                  |  80             | NULL
  4| 1      | 'Alan'  | 201801   | 1000            | NULL                  | 500             | NULL
  5| 1      | 'Alan'  | 201801   | 2000            | NULL                  | 700             | NULL
  6| 1      | 'Alan'  | 201801   | 3000            | NULL                  | 800             | NULL
  7| 1      | 'Alan'  | 201801   | 4000            | NULL                  | 700             | NULL
  8| 2      | 'Bob'   | 201712   | 400             | NULL                  | 50              | NULL
  9| 2      | 'Bob'   | 201712   | 500             | NULL                  | 60              | NULL
 10| 2      | 'Bob'   | 201712   | 600             | NULL                  | 70              | NULL
 11| 2      | 'Bob'   | 201802   | 700             | NULL                  | 70              | NULL
 12| 2      | 'Bob'   | 201802   | 800             | NULL                  | 80              | NULL
 13| 2      | 'Bob'   | 201802   | 900             | NULL                  | 90              | NULL
 14| 2      | 'Bob'   | 201802   | 900             | NULL                  | 90              | NULL

我正在尝试为每个TOTAL_CURR_MTH_PAY_AMT as SUM(CURR_MTH_PAY_AMT)的每位员工更新TOTAL_CURR_MTH_DED_AMT as SUM(CURR_MTH_DED_AMT)yearmonth,以便我的表格如下所示。

ID| EMP_NO| EMP_NAME| YEARMONTH| CURR_MTH_PAY_AMT| TOTAL_CURR_MTH_PAY_AMT| CURR_MTH_DED_AMT| TOTAL_CURR_MTH_DED_AMT
  1| 1      | 'Alan'  | 201712   | 100             | 600                  |  50             | 200
  2| 1      | 'Alan'  | 201712   | 200             | 600                  |  70             | 200
  3| 1      | 'Alan'  | 201712   | 300             | 600                  |  80             | 200
  4| 1      | 'Alan'  | 201801   | 1000            |10000                 | 500             | 2700
  5| 1      | 'Alan'  | 201801   | 2000            |10000                 | 700             | 2700
  6| 1      | 'Alan'  | 201801   | 3000            |10000                 | 800             | 2700
  7| 1      | 'Alan'  | 201801   | 4000            |10000                 | 700             | 2700
  8| 2      | 'Bob'   | 201712   | 400             | 1500                 | 50              | 180
  9| 2      | 'Bob'   | 201712   | 500             | 1500                 | 60              | 180
 10| 2      | 'Bob'   | 201712   | 600             | 1500                 | 70              | 180
 11| 2      | 'Bob'   | 201802   | 700             | 3300                 | 70              | 330
 12| 2      | 'Bob'   | 201802   | 800             | 3300                 | 80              | 330
 13| 2      | 'Bob'   | 201802   | 900             | 3300                 | 90              | 330
 14| 2      | 'Bob'   | 201802   | 900             | 3300                 | 90              | 330

我尝试在Mysql上使用此查询

update Employee_Detail set TOTAL_CURR_MTH_PAY_AMT = SUM(CURR_MTH_PAY_AMT) , TOTAL_CURR_MTH_DED_AMT = SUM(CURR_MTH_DED_AMT)
group by YYYYMM, EMP_NO;

但它给了我这个错误

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 'group by YEARMONTH, EMP_NO'.

我无法在更新时使用group by子句。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您无法将update用于update Employee_Detail join ( select EMP_NO, YEARMONTH, sum(CURR_MTH_PAY_AMT) TOTAL_CURR_MTH_PAY_AMT, SUM(CURR_MTH_DED_AMT) TOTAL_CURR_MTH_DED_AMT from Employee_Detail group by EMP_NO, YEARMONTH ) t on Employee_Detail.EMP_NO = t.EMP_NO AND Employee_Detail.YEARMONTH = T.YEARMONTH set Employee_Detail.TOTAL_CURR_MTH_PAY_AMT = t.TOTAL_CURR_MTH_PAY_AMT, Employee_Detail.TOTAL_CURR_MTH_DED_AMT = t.TOTAL_CURR_MTH_DED_AMT ,相反,您可以尝试这样做:

CURR_MTH_PAY_AMT

子查询将为每个组提取总计CURR_MTH_DED_AMT和总计join,然后Employee_Detail in memory来更新每条记录。

SQLFiddle DEMO此处。