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
子句在聚合上起作用。您的查询目前没有进行任何聚合。
因此,您需要通过 SUM
或 AVG
或 MAX
聚合 qty
才能获得有效的分组依据。我也不会考虑在这里排除 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';
再看一遍,如果您只想排除所有 0 qty
行,您只需要:
SELECT id, item_name, qty
WHERE qty <> '0';
最后,检查一下qty
的数据类型是否真的是VARCHAR
或CHAR
之类的类型。如果它是 INT
.
确实会更有意义
编辑:
您可以使用带有 GROUP BY
的 WHERE
子句来排除 0
的 qty
值。由于 qty
是 INT
数据类型,因此您不需要将值放在引号中 '
.
示例:
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
我有一个 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
子句在聚合上起作用。您的查询目前没有进行任何聚合。
因此,您需要通过 SUM
或 AVG
或 MAX
聚合 qty
才能获得有效的分组依据。我也不会考虑在这里排除 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';
再看一遍,如果您只想排除所有 0 qty
行,您只需要:
SELECT id, item_name, qty
WHERE qty <> '0';
最后,检查一下qty
的数据类型是否真的是VARCHAR
或CHAR
之类的类型。如果它是 INT
.
编辑:
您可以使用带有 GROUP BY
的 WHERE
子句来排除 0
的 qty
值。由于 qty
是 INT
数据类型,因此您不需要将值放在引号中 '
.
示例:
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