Как вычесть поле sum() из строк, «сгруппированных по»

#mysql

#mysql

Вопрос:

Имея следующую таблицу

  ------------------------ 
| id | product_id | units|
 ------------------------ 
|  1 | 6949       |   3  |
|  2 | 6949       |   7  |
|  3 | 6912       |   0  |
|  . |   .        |   .  |
 ------------------------ 
  

Я хочу подсчитать, сколько единиц связано с идентификатором продукта, поэтому я использую следующий запрос:

ВЫБЕРИТЕ id, product_id, SUM (единицы измерения) В качестве единиц измерения Из таблицы, СГРУППИРОВАННОЙ По product_id;

Которое вернет

  ------------------------ 
| id | product_id | units|
 ------------------------ 
|  1 | 6949       |   10 |
|  2 | 6912       |   0  |
 ------------------------ 
  

Как я мог бы использовать «update» для вычитания 1 единицы из любого продукта, используя его product_id? Спасибо

Комментарии:

1. Этот запрос вернет синтаксическую ошибку.

2. UPDATE используется для фактического изменения значения в вашей таблице. Если вы хотите это сделать, вам нужно указать, в какой строке вы хотите изменить единицы измерения. Оно не может быть обновлено на SUM

3. @isaace это именно то, чего я пытаюсь достичь. Я не возражаю, на какую строку влияет, если sum () является согласованным

Ответ №1:

Ваш вопрос просто запрашивает базовый GROUP BY запрос, и здесь действительный:

 SELECT
    product_id,
    SUM(units) AS units
FROM yourTable
GROUP BY
    product_id;
  

Но в вашем вопросе есть изюминка, потому что id отображаемое в наборе результатов sample на самом деле является номером строки, упорядоченным по одному из id значений в каждой группе продуктов. Мы можем попробовать написать этот запрос:

 SELECT
    ROW_NUMBER() OVER (ORDER BY MIN(id)) id,
    product_id,
    SUM(units) AS units
FROM yourTable
GROUP BY
    product_id;
  

введите описание изображения здесь

ДЕМОНСТРАЦИЯ

Комментарии:

1. спасибо за ваш ответ, но это не то, о чем я спрашивал

Ответ №2:

Попробуйте

 UPDATE table SET units = units - 1 WHERE product_id = ?
  

Комментарии:

1. это повлияло бы на все строки с этим product_id, и это именно то, чего я пытаюсь избежать. Я хотел бы вычесть 1 только из одной из этих строк

Ответ №3:

Выходные данные вашего запроса не отражают содержимое вашей таблицы, поле id для продукта 6912 не может быть 2 , если это не число строк, как предлагает @Tim. Я предполагаю, что это опечатка, поэтому to явно использует идентификатор в таблице результатов, позволяет явно выбрать тот, который мы хотим;

 select min(id) min_id, product_id, sum(units) agg_units, sum(units) - 1 agg_units_minus_one from product group by product_id order by min_id;

 ------ ------------ ----------- --------------------- 
| id   | product_id | agg_units | agg_units_minus_one |
 ------ ------------ ----------- --------------------- 
|    1 |       6949 |        10 |                   9 |
|    3 |       6912 |         0 |                  -1 |
 ------ ------------ ----------- --------------------- 
  

Теперь, если вы действительно хотите обновить единицы измерения, у нас, по крайней мере, есть уникальный идентификатор / комбинация продуктов для использования и значение для присвоения, но я подозреваю, что это не то, что вы хотите (будущие агрегации будут неправильными).

Комментарии:

1. Неплохой подход, но не то, что я искал, спасибо

Ответ №4:

Возможно, я забыл указать, что меня волнует результат sum (), а не то, правильно ли указано поле units каждой строки. Я боялся, что простое обновление повлияет на все строки с этим product_id, поэтому запрос будет

ОБНОВИТЬ таблицу SET units = единицы измерения — 1, ГДЕ product_id = 6949 ПРЕДЕЛ 1;