客户每月的 SQL 平均值

标签 sql oracle select group-by nested

“交易”表是所有交易的列表,其中包含日期客户ID、单位成本(价格)和数量

我需要一份报告,将交易按月份分组并给出计数、总收入和每个客户的平均收入。

我无法弄清楚如何将 group by customerID 插入此选择语句:

SELECT extract(month FROM date) month,
       count(*) purchases,
       SUM(price*quantity) income,
       AVG(SUM(price*quantity)) <-- this needs to be grouped by customerID aswell as month
FROM
    transactions
WHERE
    date BETWEEN i2 AND i3
GROUP BY extract(month FROM date);

我能得到的最接近的是:

SELECT extract(month FROM date) month,
       count(*) purchases,
       SUM(price*quantity) income,
       ( SELECT AVG(SUM(price*quantity))
         FROM transactions
         GROUP BY customerID, extract(month FROM date) )
FROM
    transactions t
WHERE
    date BETWEEN i2 AND i3
GROUP BY extract(month FROM date);

但在我思考了一分钟后,这种方法就不再有意义了,因为嵌套的 select 将返回多行。如果我添加一个 where 子句并在第二个选择中删除 group by date:

(SELECT AVG(SUM(price*quantity))
 FROM transactions
 GROUP BY customerID
 where extract(month FROM date) = month)

然后它会返回...我不确定是什么,但这是错误的。

顺便说一句,这是一个 Oracle 数据库(我认为是 10g)。

最佳答案

您可以使用算术来完成此操作。 。 。将总数除以客户数量:

SELECT extract(month FROM date) month,
       count(*) purchases,
       SUM(price*quantity) income,
       sum(price*quantity) / count(distinct customerId)
FROM
    transactions
WHERE
    date BETWEEN i2 AND i3
GROUP BY extract(month FROM date);

关于客户每月的 SQL 平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16217187/

相关文章:

mysql - 执行 LOAD DATA LOCAL INFILE 时获取 mysql 错误代码 : 1265. 数据被列截断

Oracle DBMS_LOB.WRITEAPPEND 到 Postgres 的转换

sql - oracle 将逗号分隔的字符串拆分为列

php - MySQL 选择,输出然后删除

mysql - MySQL WHERE 子句中的 CASE 或 COALESCE 性能

sql - 数据库中的标志 - 保持跟踪的明智方式

php - 如何使用SQL插入不存在的东西,如果存在则删除它?

sql - 如何在 SQL Server DateTime 中存储 Oracle TimeStamp 精度 6

mysql - 如何选择年龄范围内的人

mysql - 选择类别列表有父类别名称吗?