首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在不使用组的情况下显示所有和和计数

在不使用组的情况下显示所有和和计数
EN

Stack Overflow用户
提问于 2020-08-01 13:16:26
回答 3查看 53关注 0票数 0

我想检索客户名称、总订单(他们订购了多少次产品)以及他们一生中花费的总金额。运行一个没有Joingroup byhaving操作符的查询。只向至少有一份订单的客户显示。

这是我的数据库

代码语言:javascript
运行
复制
Customer-    CustomerID| CustomerName   SalesOrder- SalesOrderID | CustomerID | SaleTotal
             100000    |  John                        1001       |   100000   |  2000
             200000    |  Jane                        1002       |   100000   |  3000  
             300000    |  Sean                        1003       |   200000   |  5000

当我问起

代码语言:javascript
运行
复制
SELECT CustomerName,count(*) AS Total_Orders,sum(SaleTotal) AS SaleTotal                           
FROM Customer C,SalesOrderHeader SH WHERE C.CustomerID=SH.CustomerID;

它只显示一排。我想要的答案是

代码语言:javascript
运行
复制
CustomerName | Total_Orders | SaleTotal
John            2               5000
Jane            1               5000

我刚在mysql上新来。这里有人知道怎么做吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-01 13:28:18

如果要在不使用joingroup by的情况下这样做,那么最简单的方法是使用相关子查询:

代码语言:javascript
运行
复制
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表两次,而一次扫描就足够了。写这篇文章的更好方法是:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2020-08-01 13:27:35

使用聚合。。。以及正确的join语法:

代码语言:javascript
运行
复制
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语法。

票数 0
EN

Stack Overflow用户

发布于 2020-08-01 13:28:48

您必须使用下面的查询。没有joingroup by,就无法实现它。

代码语言:javascript
运行
复制
SELECT CustomerName,count(*) AS Total_Orders,sum(SaleTotal) AS SaleTotal                           
FROM Customer C,SalesOrderHeader SH WHERE C.CustomerID=SH.CustomerID
group by;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63205623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档