Как решить эту головоломку MySQL?

0

Текущий 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
  • В таблице URL-адресов много сайтов с каждой ценой.
  • Таблица устройств - это записи, в которых люди посещают определенный веб-сайт с помощью мобильного телефона, и этот сайт существует в таблице URL-адресов.
  • Я хочу получить среднее значение посещаемого URL-адреса в устройстве

Данные таблицы устройств:

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)
  • 2
    Как вы думаете, чего достигнет AVG(MAX(value)) ? MAX(value) получает наибольшее value . AVG(value) получает sum(value) / number of rows . Что бы сделал AVG(MAX(value)) ?
  • 1
    Предоставьте весь запрос с некоторыми примерами данных и ожидаемым результатом. Пожалуйста, определите все вещи и изложите вопрос более четко.
Показать ещё 12 комментариев
Теги:

2 ответа

0
Лучший ответ

Таким образом, вы не можете получить округленное среднее значение max()... Поскольку макс - это одно, любое среднее значение само по себе. Теперь, что вы можете сделать, это...

SELECT ROUND(AVG(value), 2), MAX(value) FROM tableName

Примечание: "значение" - ваше имя COLUMN. "tableName" - это ваше имя таблицы, очевидно :)

Тогда вам просто нужно связать его как 2 результата... Первым результатом будет округленное среднее столбца "значение". Второй результат - округленный максимум столбца "значение".

Но, к сожалению, когда вы используете MAX(), вы говорите "скажите мне, что здесь самое главное". Это ограничивает вас 1 результатом, но AVG() ожидает получить среднее значение целого столбца, точно так же как функции MAX()... поэтому у него есть некорректная группировка для работы.

  • 1
    Я не уверен, что именно этого хочет ОП. Я считаю, что мы должны подождать, пока он не прояснит, что нужно, прежде чем ответить.
  • 1
    хммм ... позвольте мне попробовать это
Показать ещё 6 комментариев
0

Кажется, вы просто хотите 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню