如何从“分组依据”行中减去sum()字段

时间:2019-03-27 14:02:18

标签: mysql

具有下表

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

我想计算链接到产品ID的单位数,因此我使用以下查询:

  

SELECT id,product_id,SUM(单位)来自表GROUP BY product_id的AS单位;

哪个会返回

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

我如何使用“ update”从使用product_id的任何产品中减去1个单位?谢谢

4 个答案:

答案 0 :(得分:1)

也许我忘了提到我关心的是sum()结果,而不是如果每行的units字段正确的话。我担心简单的更新会影响到具有该product_id的所有行,因此查询将为

  

更新表SET单位=单位-1 WHERE product_id = 6949 LIMIT 1 ;

答案 1 :(得分:0)

您的问题仅是询问基本的GROUP BY查询,这里是一个有效的查询:

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

但是您的问题有所不同,因为出现在样本结果集中的id实际上看起来是行号,按每个产品组中的id值之一排序。我们可以尝试编写以下查询:

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

enter image description here

Demo

答案 2 :(得分:0)

尝试

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

答案 3 :(得分:0)

查询的输出不反映表的内容,产品6912的id字段不能为2,除非它是@Tim建议的行数。我猜这是一个错字,因此要在结果表中明确使用ID,可以明确选择所需的ID;

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 |
+------+------------+-----------+---------------------+

现在,如果您真的要更新单元,我们至少要使用唯一的ID /产品组合和要分配的值,但是我怀疑这不是您想要的(以后的汇总)会是错误的。)