I am trying to do aggregations based on columns specified in MySQL query. Here's some sample data:
CREATE TABLE MyTable (id char(10), name char(10), price int, cat int, size int);
INSERT INTO MyTable (id, name, price, cat, size)
VALUES ('2065511307', 'abc', 2449, 1, 600),
('65fH72', 'bcd', 4395, 1, 851),
('65fH72', 'bcd', 4995, 2, 985),
('65fH72', 'bcd', 4678, 1, 865);
I'd like to group by id
and cat
columns and compute the avg
of price
and size
columns. When I run the query, I don't get the results I expect.
SELECT id, cat, AVG(price) as avg_price, AVG(size) as avg_size
FROM table1
GROUP BY id, cat
HAVING avg_price <= 10000
The results I expect to see:
CodePudding user response:
Here is a query that will get you the correct result.
SELECT id, name, ROUND(AVG(price), 0) AS avg_price, cat, ROUND(AVG(size), 0) AS avg_size
FROM MyTable
GROUP BY id, cat
HAVING avg_price <= 10000;
Note, you may have to turn the ONLY_FULL_GROUP_BY
option off to get this query to run. This also assumes name
is functionally dependent on id
.
The query below will work if you are unable to turn the ONLY_FULL_GROUP_BY
option off.
SELECT id,
(SELECT name FROM MyTable AS mt WHERE mt.id=MyTable.id LIMIT 1) AS name,
ROUND(AVG(price), 0) AS avg_price, cat, ROUND(AVG(size), 0) AS avg_size
FROM MyTable
GROUP BY id, cat
HAVING avg_price <= 10000;
CodePudding user response:
I do not understand your expected output, but this is This MySQL ORDER BY would return all records sorted by the id order, with a secondary sort by cat order. Therefore, it is linked to two remaining, and it is not one values