查找平均SQL语句多个表

2020-02-22 sql datatables

尝试通过用户购买brocolli的次数获得平均值,然后以当时的价格获得平均值。如果用户尚未购买,则为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

维拉格

我还尝试简化以仅使用购买者表并得到错误的结果,但是也许我可以在运行过程中对其进行调整。

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;

Answers

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

除了我仍然看不到你为什么要要求平均名称列...

您到底想做什么?

如果我理解正确,则您正在尝试获取每个用户的西兰花平均购买价格。您通过第二个查询更接近实现此目标,您只需要按购买的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关键字(或仅输入逗号)。另外,您有一个子查询,在它旁边有一个表(用户),它们之间没有任何关联。您必须指定如何将两者联接,即是否需要内部,外部,左侧或右侧联接。在大多数系统中,您也可以使用逗号来表示联接,但是您甚至没有联接。 无论如何,即使您确实修复了语法,子查询也是不必要的,因为您无需使用子查询就可以实现相同的目的。

编辑(对原始帖子进行编辑后): 包括从未购买过任何花椰菜的用户的最佳方法是,像上次尝试一样,对PURCHASES表进行左联接。但是,您需要按用户名分组,因为它出现在您的选择列表中。在这种情况下,不需要按产品名称分组。因此,我建议:

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;

你需要一个LEFT JOINUSERSPURCHASESGROUP 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

Related