SQL的联接/子查询

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

我正在努力解决以下问题:

查询在所有发票上花费低于平均金额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 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

  

您正在使用哪个数据库管理系统?