2013-04-25 134 views
2

该表的“交易”是所有具有date,customerID,单位成本(price)和quantity的交易的列表。客户每月的SQL平均值

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

我无法搞清楚如何将group by customerID这个select语句:

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)。

回答

2

您可以使用算术做到这一点。 。 。除以客户总数:

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); 
+0

......我不知道为什么我没有想到这一点。谢谢。 – slicedtoad 2013-04-25 14:32:22