Group by with having 子句 a key not equal

Group by with having clause a key not equal

我有一个 table 结构和值:-

used_items

id  item_name   qty

24  Potatoes    0
25  Potatoes    500
26  test        88
27  Wheat       3
28  abc         10

我想根据item_name分组,比如查询should return single item_name where qty!=0。 我用过这个查询-

SELECT * from used_items group by item_name having qty!='0'

这个查询没有return土豆,结果-

  id    item_name   qty

    26  test        88
    27  Wheat       3
    28  abc         10

预期结果-

id  item_name   qty

25  Potatoes    500
26  test        88
27  Wheat       3
28  abc         10

它还应该 return item_name Potatoes 非零值包含在组中。 我怎样才能做到这一点?

编辑- 我使用了 Group by,因为我想要唯一的 item_name,如果 qty 对所有相同的 item_name 为 0,它应该跳过 item_name。但如果行 qty 中至少有一个为 0(例如 Potatoes),则查询将跳过。 另外,如果 qty 为 0,它应该根据 id 升序获取匹配 item_name 的行。希望我清楚,例如;

数据:-

id  item_name   qty

24  Potatoes    0
25  Potatoes    500
27  Potatoes    400
28  test        88
29  Wheat       3
30  abc         10

预期结果,return使用第一个插入的非零值

唯一 item_name
id  item_name   qty
25  Potatoes    500
28  test        88
29  Wheat       3
30  abc         10

为什么不使用聚合函数就使用分组依据?如果我理解你的问题,为了达到你的预期结果,你可以..

SELECT DISTINCT(item_name), qty from used_items where qty!='0
SELECT MAX(id) id, item_name, SUM(qty) qty
  FROM used_items
 GROUP BY item_name
HAVING SUM(qty) > 0
 ORDER BY MAX(id);

应该为你做。看到这个。 https://www.db-fiddle.com/f/9hmTPkNkhpjqGrFvUeLzjW/1

MAX(id) 的目的是从您的 GROUP BY 操作中获取有效的 id 列值。

您误用了 MySQL 的 notorious non-standard GROUP BY handling,因此得到了奇怪的结果。

您的查询结构有问题。当您 GROUP BY by 您正在处理聚合数据时, HAVING 子句在聚合上起作用。您的查询目前没有进行任何聚合。

因此,您需要通过 SUMAVGMAX 聚合 qty 才能获得有效的分组依据。我也不会考虑在这里排除 id,因为它在聚合中没有用。

例如:

SELECT item_name, MIN(qty)
FROM used_items
GROUP BY item_name
HAVING MIN(qty) <> '0'

如果您只想找到独特的组合,也可以考虑使用 DISTINCT。同样,idDISTINCT 没有用。 DISTINCT 不聚合。

例如:

SELECT DISTINCT item_name, qty
FROM used_items
WHERE qty <> '0';

再看一遍,如果您只想排除所有 0 qty 行,您只需要:

SELECT id, item_name, qty
WHERE qty <> '0';

最后,检查一下qty的数据类型是否真的是VARCHARCHAR之类的类型。如果它是 INT.

确实会更有意义

编辑: 您可以使用带有 GROUP BYWHERE 子句来排除 0qty 值。由于 qtyINT 数据类型,因此您不需要将值放在引号中 '.

示例:

SELECT item_name, MAX(qty)
FROM used_items
WHERE qty <> 0
GROUP BY item_name

希望对您有所帮助。

如果您想要每个 item_name 第一个非 0(数量)行,那么您可以使用相关子查询来完成:

SELECT t.*
FROM tablename t
WHERE t.id = (SELECT MIN(id) FROM tablename WHERE item_name = t.item_name AND qty <> 0)

参见demo
结果:

> id | item_name | qty
> -: | :-------- | --:
> 25 | Potatoes  | 500
> 28 | test      |  88
> 29 | Wheat     |   3
> 30 | abc       |  10