【问题标题】:How to apply different GROUP BY to each aggregate functions in MySql如何对 MySql 中的每个聚合函数应用不同的 GROUP BY
【发布时间】:2020-08-14 04:05:48
【问题描述】:

我有一个简单的问题,但我无法在文档或谷歌中找到答案。我有一张包含客户信息的表格,另一张包含有关订单的信息。每个客户都有多个订单。我需要创建 3 列:一列包含客户 ID,一列包含该客户的订单数,一列包含订单总数。示例:

客户表

CustomerID  | PhoneNumber 
____________|____________
   AAA      |   1-222-2
   BBB      |   1-333-3

订单表

CustomerID  | OrderID
____________|____________
    AAA     |  1
    AAA     |  2
    BBB     |  3
    BBB     |  4
    BBB     |  5

预期结果:

Customer ID  | Number of orders  | Total number of orders
_____________|___________________|_______________________
    AAA      |       2           |          5
    BBB      |       3           |          5

当我使用 COUNT(OrderID) 时,我得到订单总数,当我将 COUNT 与 GROUP BY CustomerID 一起使用时,我得到每个客户的订单数,但我无法在同一个表中检索两者。有没有办法在 MySql 中做到这一点?

【问题讨论】:

  • 欢迎使用 SO 的代码编写服务

标签: mysql sql


【解决方案1】:

这是一个 MySQL 8+ 的方法,使用带有分析函数的单通道查询:

SELECT
    CustomerID,
    COUNT(*) AS num_orders,
    SUM(COUNT(*)) OVER () AS total_num_orders
FROM Orders
GROUP BY
    CustomerID;

Demo

【讨论】:

    【解决方案2】:

    你可以试试这个-

    select customerid, count(*) no_of_orders,
          (select count(*) from tablename) as total_no_of_orders
    from tablename
    group by customerid
    

    【讨论】:

      【解决方案3】:

      使用窗口函数的另一种方法:

         SELECT A.*, SUM(CUSTOMER_WISE_COUNT) OVER(ORDER BY CUSTOMERID ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM (
          SELECT COUNT(*) CUSTOMER_WISE_COUNT, CUSTOMERID FROM CUSTOMERS GROUP BY CUSTOMERID) A
      

      ;

      【讨论】:

        猜你喜欢
        • 2014-11-28
        • 2014-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-09
        • 2013-12-03
        • 2017-09-16
        相关资源
        最近更新 更多