SQL的联接/子查询
我正在努力解决以下问题: 查询在所有发票上花费低于平均金额50%的所有客户。对于每个客户,显示他们的姓名和花费金额,精确到6位小数。按花费的金额从高到低排列结果SQL的联接/子查询,sql,Sql,我正在努力解决以下问题: 查询在所有发票上花费低于平均金额50%的所有客户。对于每个客户,显示他们的姓名和花费金额,精确到6位小数。按花费的金额从高到低排列结果 假设您希望客户花费低于发票平均值,请尝试以下方法: SELECT customer_name, CAST(SUM(total_price) AS DECIMAL(20,6) AS amount FROM customer c INNER JOIN invoice i ON c.id = i.customer_id WHERE amo
假设您希望客户花费低于发票平均值,请尝试以下方法:
SELECT customer_name, CAST(SUM(total_price) AS DECIMAL(20,6) AS amount
FROM customer c
INNER JOIN invoice i
ON c.id = i.customer_id
WHERE amount < (SELECT AVG(total_price) FROM i)
ORDER BY amount DESC
基本思想是在聚合后使用having子句:
SELECT c.id, c.customer_name, SUM(total_price) AS amount
FROM customer c LEFT JOIN
invoice i
ON c.id = i.customer_id
GROUP BY c.id, c.customer_name
HAVING COALESCE(SUM(total_price), 0) < (SELECT AVG(total_price) FROM i) ;
注意:这包括没有发票的客户。您可以使用窗口功能计算发票表的客户合计和合计平均值,然后将其连接到客户表,如下所示:
select customer_name,round(max(customer_total),6) as amount_spent
from customer c
inner join (
select customer_id,sum(total_price)over(partition by customer_id) Customer_Total, avg(total_price)over() Total_average from invoice) i
on c.id=i.customer_id
where customer_total<=total_average?2
group by customer_name
order by customer_total desc
您正在使用哪个数据库管理系统?