Текущий sql:
SELECT
clientId,
groupID,
COUNT(DISTINCT clientId) AS visitors,
ROUND(AVG(price),2) AS price
FROM
(
SELECT 'devices'.*, MAX('url'.price) AS price
FROM 'devices', 'url'
WHERE 'devices'.visited_url = 'url'.website
) devices
GROUP BY 'devices'.groupID
Данные таблицы устройств:
id clientId device groupId visited_url
1 client1 samsung 123 fb.com
2 client1 samsung 123 google.com
3 client1 samsung 123 fb.com
4 client1 samsung 123 fb.com
5 client2 iphone 123 google.com
6 client2 iphone 123 google.com
Данные таблицы URL:
id website price
1 fb.com $1
2 google.com $2
Я хочу получить цены на visit_url
Пробовал этот метод:
ROUND(AVG(MAX(value)),2) AS value
И получил эту ошибку:
Error Code: 1111. Invalid use of group function
Возникает вопрос: как объединить ROUND()
, AVG()
и MAX()
в одной строке?
В результате я хочу:
clientId groupID website visitors price
client1 123 fb.com 3 $3 (avg)
client1 123 google.com 1 $2 (avg)
client2 123 google.com 2 $4 (avg)
Таким образом, вы не можете получить округленное среднее значение max()... Поскольку макс - это одно, любое среднее значение само по себе. Теперь, что вы можете сделать, это...
SELECT ROUND(AVG(value), 2), MAX(value) FROM tableName
Примечание: "значение" - ваше имя COLUMN. "tableName" - это ваше имя таблицы, очевидно :)
Тогда вам просто нужно связать его как 2 результата... Первым результатом будет округленное среднее столбца "значение". Второй результат - округленный максимум столбца "значение".
Но, к сожалению, когда вы используете MAX(), вы говорите "скажите мне, что здесь самое главное". Это ограничивает вас 1 результатом, но AVG() ожидает получить среднее значение целого столбца, точно так же как функции MAX()... поэтому у него есть некорректная группировка для работы.
Кажется, вы просто хотите JOIN
к JOIN
и GROUP BY
. На основе результата, который вы хотите:
SELECT clientId, groupID, COUNT(*) AS visitors,
ROUND(SUM(price), 2) AS price
FROM devices d JOIN
url u
ON d.visited_url = u.website
GROUP BY clientId, groupID;
AVG(MAX(value))
?MAX(value)
получает наибольшееvalue
.AVG(value)
получаетsum(value) / number of rows
. Что бы сделалAVG(MAX(value))
?