Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多个表中查找平均SQL语句_Sql_Datatables - Fatal编程技术网

在多个表中查找平均SQL语句

在多个表中查找平均SQL语句,sql,datatables,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; 编辑 我也尝试过简化,只使用Purchases表,得到错误的结果,

试图通过用户购买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;
编辑

我也尝试过简化,只使用Purchases表,得到错误的结果,但也许我可以在它运行时查看它

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;
但实际上,你需要的只是

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列。这将为您提供每次购买的平均值,这在Purchases表中是毫无意义的。所以,我认为你所需要的是:

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关键字,否则将丢失逗号。此外,还有一个子查询,在它旁边有一个表Users,它们之间没有任何关联。您必须指定要如何连接这两个节点,即是要内部连接、外部连接、左侧连接还是右侧连接。在大多数系统中,您也可以使用逗号表示连接,但您甚至没有逗号。 在任何情况下,即使您修复了语法,子查询也是不必要的,因为您可以在没有子查询的情况下实现同样的功能

编辑原始帖子后进行编辑: 要包含从未购买过任何花椰菜的用户,最好的方法是执行到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;
您需要一个用户的左连接,以便按用户进行购买和分组:


我试过了,结果发现同样的东西说专栏不在那里。不明确的列名:IDUsers表是否有ID字段?是的,所有表都有ID和使用usersPlus中的userid进行购买的ID如何计算像name这样的文本字段的平均值?平均值通常表示数值。但是PURCHASES.UserId是否与USERS.ID相同?更改后,请立即尝试。平均值是多少?在这种情况下,预期结果是什么?什么时候的价格?因此,我认为这很接近,但我编辑了一个问题,我需要输出为UserId,我添加的是,如果PURCHASES表没有列出产品的用户,那么它们应该是输出为零。抱歉,我无法提前跟进。我认为最后一个查询,即在编辑后的答案中带有左连接的查询,是最好的解决方案,尽管您需要按用户名分组,而不是按产品分组,因为它是您在选择列表中的用户名。我已编辑了我的答案,以匹配您问题的新版本。这很接近,但0必须在售价中。
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
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;
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