显示所有的总和和计数而不使用分组依据

时间:2020-08-01 13:16:26

标签: mysql sql

我想检索客户名称,总订单(他们订购产品的时间)以及他们一生中花费的总金额。在没有Joingroup byhaving运算符的情况下运行单个查询。只显示至少有一个订单的客户。

这是我的数据库

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的新手。 那么这里有人知道怎么做吗?

3 个答案:

答案 0 :(得分:1)

如果要在没有joingroup 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)

您必须使用以下查询。没有joingroup by

,您将无法实现它
SELECT CustomerName,count(*) AS Total_Orders,sum(SaleTotal) AS SaleTotal                           
FROM Customer C,SalesOrderHeader SH WHERE C.CustomerID=SH.CustomerID
group by;
相关问题