1

我有一个表结构和值: -

used_items

id  item_name   qty

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

我想根据item_name诸如查询应该返回单个item_namewhere进行分组qty!=0。我用过这个查询——

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

此查询不返回 Potatoes,结果-

  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

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

编辑-我用过Group by是因为我想要唯一的item_name,它应该跳过item_nameif qtyis 0 for all same item_name。但如果至少一行qty是 0(例如Potatoes),则查询会跳过。此外,如果 qty 为 0,它应该item_name根据 id 升序获得匹配的行。希望我很清楚,例如;

数据:-

id  item_name   qty

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

预期结果,返回唯一item_name且第一个插入的非零值

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

4 回答 4

2

您的查询结构是问题所在。当您GROUP BY使用聚合数据和聚合HAVING上的子句函数时。您的查询目前不进行任何聚合。

因此,您需要聚合qtybySUMAVGorMAX以获得有效的 group by。我也不会考虑排除id这里,因为它总体上没有用。

例如:

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

DISTINCT如果您只想找到独特的组合,也可以考虑使用。同样,id将不会对DISTINCT. DISTINCT不聚合。

例如:

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

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

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

最后,只需检查数据类型qty实际上是一个VARCHARCHAR类似的类型。如果它是一个INT.


编辑:您可以使用WHERE带有 a 的子句来GROUP BY排除. 由于它是一种数据类型,因此您无需将值放在引号中。qty0qtyINT'

例子:

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

我希望这有帮助。

于 2020-12-03T14:40:25.617 回答
1

你为什么在没有聚合函数的情况下使用 group by?如果我理解你的问题,为了达到你的预期结果,你可以......

SELECT DISTINCT(item_name), qty from used_items where qty!='0
于 2020-12-03T14:31:40.183 回答
1

如果您想要每个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)

请参阅演示
结果:

> id | item_name | qty
> -: | :-------- | --:
> 25 | Potatoes  | 500
> 28 | test      |  88
> 29 | Wheat     |   3
> 30 | abc       |  10
于 2020-12-03T14:57:59.967 回答
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)的目的是从您的操作中获取有效的id列值。GROUP BY

您滥用了 MySQL臭名昭著的非标准 GROUP BY 处理,因此得到了奇怪的结果。

于 2020-12-03T14:31:48.613 回答