我想检索客户名称,总订单(他们订购产品的时间)以及他们一生中花费的总金额。在没有Join
,group by
,having
运算符的情况下运行单个查询。只显示至少有一个订单的客户。
这是我的数据库
Customer- CustomerID| CustomerName SalesOrder- SalesOrderID | CustomerID | SaleTotal
100000 | John 1001 | 100000 | 2000
200000 | Jane 1002 | 100000 | 3000
300000 | Sean 1003 | 200000 | 5000
查询时
SELECT CustomerName,count(*) AS Total_Orders,sum(SaleTotal) AS SaleTotal
FROM Customer C,SalesOrderHeader SH WHERE C.CustomerID=SH.CustomerID;
它仅显示一行。 我想要的答案是
CustomerName | Total_Orders | SaleTotal
John 2 5000
Jane 1 5000
我只是mysql的新手。 那么这里有人知道怎么做吗?
答案 0 :(得分:1)
如果要在没有join
和group by
的情况下执行此操作,那么最简单的方法是使用相关子查询:
select *
from (
select
c.customerName,
(
select count(*)
from salesOrder so
where so.customerID = c.customerID
) totalOrders,
(
select sum(salesTotal)
from salesOrder so
where so.customerID = c.customerID
) saleTotal
from customer c
) t
where totalOrders > 0
请注意,此查询显然不是最佳选择-因为它扫描salesOrder
表两次,而一次扫描就足够了。更好的写法是:
select c.customerName, count(*) totalOrders, sum(salesTotal) saleTotal
from customer c
inner join saleOrder so on so.customerID = c.customerID
group by c.customerID, c.customerName
这里不需要having
子句-inner join
过滤掉尚无订单的客户。
答案 1 :(得分:0)
使用聚合。 。 。正确的join
语法:
SELECT CustomerName, COUNT(*) AS Total_Orders, SUM(SaleTotal) AS SaleTotal
FROM Customer C JOIN
SalesOrderHeader SH
ON C.CustomerID = SH.CustomerID
GROUP BY CustomerName;
您的查询将在几乎所有数据库中失败-包括MySQL的较新版本。您在SELECT
中混合了聚合列和未聚合列。未汇总的应放在GROUP BY
中。
从不在FROM
子句中使用逗号。 始终使用正确的,明确的,标准,可读的JOIN
语法。
答案 2 :(得分:0)
您必须使用以下查询。没有join
和group by
SELECT CustomerName,count(*) AS Total_Orders,sum(SaleTotal) AS SaleTotal
FROM Customer C,SalesOrderHeader SH WHERE C.CustomerID=SH.CustomerID
group by;