Sql 按月份分组的每个用户的平均总和
我有3个表1)用户(userId,age)2)购买(purchaseId,userId,itemId,date)3)项目(itemId,price)。目标是编写一个查询,显示每个用户按月份分组的平均购买金额。我目前还不确定是否需要第一张桌子,到目前为止,我有这样的smth:Sql 按月份分组的每个用户的平均总和,sql,Sql,我有3个表1)用户(userId,age)2)购买(purchaseId,userId,itemId,date)3)项目(itemId,price)。目标是编写一个查询,显示每个用户按月份分组的平均购买金额。我目前还不确定是否需要第一张桌子,到目前为止,我有这样的smth: SELECT Purchases.userid, Purchases.date, Purchases.itemId Items.itemId, AVG(SUM(Items.price)) FROM Purchases INN
SELECT Purchases.userid, Purchases.date, Purchases.itemId Items.itemId, AVG(SUM(Items.price))
FROM Purchases
INNER JOIN Purchases.itemId ON Items.itemId
GROUP BY (somehow group by month)
我被卡住了。请你解释一下,如何写这样一个查询。很抱歉,我没有表的示例,也没有正确的输出示例,因为这是一项测试任务。谢谢 在SQL Server中:
SELECT p.userid, itm.itemId, YEAR(p.date), MONTH(p.date), AVG(itm.price)
FROM Purchases p
INNER JOIN Items itm ON p.itemId = itm.itemId
GROUP BY p.userid, itm.itemId, YEAR(p.date), MONTH(p.date)
你可以试试这个
SELECT Purchases.userid, MONTH(Purchases.date), AVG(Items.price)
FROM Purchases
INNER JOIN Items ON Purchases.itemId = Items.itemId
GROUP BY Purchases.userid, MONTH(Purchases.date)
按月分组需要将日期放入与该日期相关的年和月的“桶”中。每种数据库类型都有自己独特的功能集,例如
--MS SQL Server
SELECT Purchases.userid, Purchases.itemId, year(Purchases.date), month(Purchases.date), AVG(Items.price)
FROM Purchases
GROUP BY Purchases.userid, Purchases.itemId, year(Purchases.date), month(Purchases.date)
--Oracle
SELECT Purchases.userid, Purchases.itemId, trunc(Purchases.date,'YYYYMM'), AVG(Items.price)
FROM Purchases
GROUP BY Purchases.userid, Purchases.itemId, trunc(Purchases.date,'YYYYMM')
不能使用双重聚合,如
AVG(SUM(Items.price))
因此,您可以作为一个子查询来获取SUM
,然后使用AVG
在SQL Server中:
SELECT
Purchases.userid,
YEAR(Purchases.date),
MONTH(Purchases.date),
Purchases.itemId
Items.itemId,
AVG(Items.SumPrice)
FROM
Purchases
INNER JOIN
Users T2 ON Purchases.userId = T2.userId
INNER JOIN
(SELECT
itemId, SUM(price) AS SumPrice
FROM
Items
GROUP BY
itemId) AS Items ON Items.itemId
GROUP BY
Purchases.userid, Purchases.itemId,
YEAR(Purchases.date),
MONTH(Purchases.date),
Items.itemId
添加示例数据和预期输出?感谢您的回复!正如我提到的:“很抱歉,我没有表的示例,也没有正确的输出示例,因为这是一项测试任务。”“以某种方式按月分组”是通过使用日期列上的函数来解决的,但是由于您没有确定您使用的数据库(例如MySQL、Oracle、MS SQL Server、Postgres),我们无法建议使用哪个函数。每个数据库都有不同的函数名,但每个数据库都有一个函数返回从任何日期算起的年份和月份。(因此,请选择一个标记,告诉我们您实际需要用于哪个数据库。)@Used_By_ready数据库未指定。这是一项测试任务,所以,我想,我可以使用任何方言。所以,选择一种并将其用作标记。(注:@和用户名之间没有空格)