2013-04-01 4 views
0

После выполнения этого запроса я получаю сообщение об ошибке с недопустимым использованием функции группы. Я уверен, что после утверждения case мне нужна «сумма AS» или «AS i.amount», но mySQl тоже не нравится. Какие-либо предложения?обновление с использованием операторов case и sum

update INVITATION AS i 
LEFT JOIN REGISTRATION AS r on i.id=r.INVITATION_id 
LEFT JOIN FUNDING AS f on r.id=f.REGISTRATION_id 
SET i.funding_travel_amount = SUM(case 
when f.category = "Other" then sum(amount) 
when f.category = "Airfare" then sum(amount) 
when f.category = "Mileage" then sum(amount) 
else 0 end), i.funding_travel = "Custom" 
WHERE i.funding_hotel = "Prepaid" 
and i.funding_travel = "None" 
and i.funding_per_diem = "None" 
and (f.category = "Other" OR f.category ="Airfare" OR f.category= "Mileage") 
and f.id is not null; 
+0

Я не понимаю, почему вы используете 'CASE ... WHEN', если вы выбираете строки только с тремя значениями. – hjpotter92

ответ

0

Это ваш запрос отформатированный поэтому более читаемым (по крайней мере, для меня):

update INVITATION i LEFT JOIN 
     REGISTRATION r 
     on i.id=r.INVITATION_id LEFT JOIN 
     FUNDING AS f on r.id=f.REGISTRATION_id 
    SET i.funding_travel_amount = 
      SUM(case when f.category = "Other" then sum(amount) 
        when f.category = "Airfare" then sum(amount) 
        when f.category = "Mileage" then sum(amount) 
        else 0 
       end), 
     i.funding_travel = "Custom" 
    WHERE i.funding_hotel = "Prepaid" and 
      i.funding_travel = "None" and 
      i.funding_per_diem = "None" and 
      (f.category = "Other" OR f.category ="Airfare" OR f.category= "Mileage") and 
      f.id is not null; 

Онее проблема очевидна - у вас есть заявления сумма, в пределах сумм. Я пишу это с коррелированными подзапросами:

update INVITATION 
    SET funding_travel_amount = 
      (select SUM(case when f.category = "Other" then amount 
          when f.category = "Airfare" then amount 
          when f.category = "Mileage" then amount 
          else 0 
         end) 
      from Registration r join 
        Funding f 
        on r.id=f.REGISTRATION_id and 
        invitation.id = r.invitation_id 
      ), 
     funding_travel = "Custom" 
    WHERE funding_hotel = "Prepaid" and 
      funding_travel = "None" and 
      funding_per_diem = "None" 

Это не совсем то же самое, потому что он будет обновлять сумму, даже если ни одна из категорий не avaialble. Вы можете исправить это с дополнительным условием на where.

+0

@ Гордон, когда я попробую ваш запрос, я получаю сообщение об ошибке, которое читает недопустимое использование групповой функции. – user2232926

+0

@ пользователь2232926. , , Я изначально ответил слишком быстро. Я видел 'sum()' внутри 'sum()', и это вызвало мой ответ. Я бы написал запрос, используя коррелированный подзапрос, который я теперь включил в качестве ответа. –

0

Вероятно, вы должны удалить сумму до того количества.

+0

Я также пробовал следующее: Как вы можете сказать им совершенно новое в этом. – user2232926

+0

обновление ПРИГЛАШЕНИЕ КАК я LEFT JOIN регистрации в качестве г на i.id = r.INVITATION_id LEFT JOIN ФИНАНСИРОВАНИЕ КАК F на r.id = f.REGISTRATION_id SET i.funding_travel_amount = (SELECT SUM (SUM (f.category = «Other» + f.category = «Airfare» + f.category = «Пробег»))), i.funding_travel = «Пользовательский» \t ГДЕ i.funding_hotel = "Предоплата" \t и i.funding_travel = "None" \t и i.funding_per_diem = "None" \t и (f.category = "Другой" ИЛИ f.category = "Авиабилет" ИЛИ f.category = "Пробег") \t и f.id не является нулевым; – user2232926

+0

ОК, я предлагаю вам поделиться определением схемы таблицы и некоторыми образцами данных, желаемым результатом. Тогда люди могут помочь вам быстро. – ljh

Смежные вопросы