Найти средний SQL оператор нескольких таблиц - PullRequest
0 голосов
/ 22 февраля 2020

Попытка получить среднее количество раз, когда пользователь покупал брокколи, а затем цену в то время. 0, если пользователь еще не купил. Это работает и говорит, что не может видеть столбец Имя. Чего мне не хватает?

SELECT U.ID, U.NAME, COALESCE(AVG(P.PRICE),0) AS SELLPRICE FROM USERS AS U 
LEFT JOIN PURCHASES AS P ON U.ID=P.USERID AND P.FoodId=1 GROUP BY U.ID;

РЕДАКТИРОВАТЬ

SELECT P.USERID, U.NAME, AVG(P.PRICE) AS "Sell Price"
FROM PURCHASES AS P INNER JOIN USERS AS U ON CASE WHEN P.ID NOT NULL THEN 
"Sell Price" ELSE 0 WHERE P.FOODID=1

verag

Я также попытался упростить до просто используйте таблицу покупателей и получите неправильные результаты, но, возможно, я могу настроить это по ходу работы.

SELECT AVG(A.Price),ID FROM PURCHASES AS A WHERE FOODID=1 GROUP BY ID;

Честно говоря, частично это было связано с тем компилятором, который я использовал, так как это был компилятор сайта браузера, так что даже когда он работал на моей машине, он давал разные результаты на сайте. Я закончил использовать внутреннее соединение двух таблиц. Обновление Это правильно работает для ответа. Спасибо.

SELECT U.ID, U.NAME, AVG(P.PRICE) FROM USERS AS U LEFT JOIN  PURCHASES AS P ON U.ID = P.USERID AS P AND P.FoodId=1 GROUP BY U.ID, P.NAME;

Ответы [ 3 ]

1 голос
/ 22 февраля 2020

Если я правильно понимаю, вы пытаетесь получить среднюю цену покупки брокколи для каждого пользователя. Вы ближе к достижению этого со своим вторым запросом, вам просто нужно сгруппировать по столбцу UserId (чтобы получить среднее значение для пользователя), а не по столбцу Id (это даст вам среднее значение за покупку - вид бессмысленного) покупок Таблица. Итак, я думаю, все, что вам нужно, это:

SELECT AVG(PRICE), USERID FROM PURCHASES WHERE FOODID=1 GROUP BY USERId

Если вы хотите добавить некоторую информацию о пользователях к вашему выводу, например, их имя, вам нужно объединиться с таблицей Users:

SELECT AVG(P.PRICE), P.USERID, U.NAME 
FROM PURCHASES AS P INNER JOIN USERS AS U ON P.USERID = U.ID 
WHERE P.FOODID=1 
GROUP BY P.USERId, U.NAME

Ваш первый запрос, боюсь, имеет несколько синтаксических проблем. Например, имя aver_output не соответствует таблице или столбцу подзапроса. Если вы пытаетесь назвать свой столбец средней цены, вам понадобится ключевое слово AS (или просто потеряйте запятую). Кроме того, у вас есть подзапрос, и рядом с ним у вас есть таблица (Пользователи) без какой-либо корреляции между ними. Вы должны указать, как вы хотите объединить два, то есть хотите ли вы внутреннее, внешнее, левое или правое соединение. В большинстве систем вы также можете использовать запятую для обозначения соединения, но у вас его даже нет. В любом случае, даже если вы исправите синтаксис, подзапрос не нужен, так как вы можете достичь того же самого без него.

Правка (после правки на исходное сообщение): Лучший способ включить пользователей, которые никогда не покупали брокколи, - это выполнить левое соединение с таблицей ПОКУПКИ, как в вашей последней попытке. Однако вам нужно сгруппировать по имени пользователя, потому что оно появляется в вашем списке выбора. Группировка по названию товара в этом случае не нужна. Итак, я предлагаю:

SELECT U.ID, U.NAME, AVG(P.PRICE) FROM USERS AS U LEFT JOIN PURCHASES AS P ON U.ID = P.USERID AND P.FoodId=1 GROUP BY U.ID, U.NAME;
0 голосов
/ 24 февраля 2020

Вам нужно от LEFT JOIN из USERS до PURCHASES и GROUP BY пользователя:

SELECT 
  U.ID, U.NAME, 
  COALESCE(AVG(P.PRICE), 0) AS "Sell Price",
  COUNT(P.USERID) AS "Number of purchases"
FROM USERS AS U LEFT JOIN PURCHASES AS P 
ON P.USERID = U.ID AND P.FOODID = 1
GROUP BY U.ID, U.NAME
0 голосов
/ 22 февраля 2020
SELECT U.Id, AVG(U.NAME)  
FROM (SELECT PRICE, USERID, ID   
      FROM PURCHASES WHERE FOODID=1) P   
    Join USERS U on U.Id = P.USERId   
GROUP BY U.ID

Но на самом деле все, что вам нужно, это

SELECT U.Id, AVG(U.NAME)  
FROM PURCHASES P Join USERS U 
   on U.Id = P.USERId   
WHERE P.FOODID = 1          
GROUP BY U.ID

, за исключением того, что я до сих пор не понимаю, почему вы запрашиваете среднее для столбца Имя ...

Что именно ты пытаешься сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...