【问题标题】:SQL Counting the Count ResultsSQL 对计数结果进行计数
【发布时间】:2019-11-07 04:11:58
【问题描述】:

我正在尝试生成要在 Data Studio 中显示的销售报告。我有列 email、order_number 和 total_price,我正在尝试使用 sql 查询来识别以下内容:

  1. 重复和新客户的数量(计算订单数量,如果订单 > 1 则重复,否则为新客户)
  2. 回头客和新客户的订单数量
    Date     | email             | Order_number | Total Price 
---------------------------------------------------------------
    101019   | email1@email.com  | 1111         | 100         
    101019   | email2@email.com  | 1112         | 200        
    111019   | email3@email.com  | 1113         | 130         
    111019   | email1@email.com  | 1111         | 100  

我所做的只是统计每封邮件的订单数量

SELECT email, count(email) as order_count, date FROM orders GROUP BY 
email

这是我要展示的示例报告

    Repeating Customer | New Customer  
        1              |       2


    Orders from Repeating Cust. | Orders from New Customer
          2                     |    2


    Total Price Repeating Cust. | Total Price New Custo.
          200                   |      330

非常感谢任何帮助。

【问题讨论】:

    标签: sql


    【解决方案1】:

    你可以试试 Case 和 Sub 查询:

    SELECT SUM(CASE WHEN t.Cust_cnt=1 THEN 1 ELSE 0 END) AS New_Cust,
           SUM(CASE WHEN t.Cust_cnt>1 THEN 1 ELSE 0 END) AS Repeat_Cust,
           SUM(CASE WHEN t.Cust_cnt=1 THEN t.Total_Order ELSE 0 END) AS New_Cust_Order,
           SUM(CASE WHEN t.Cust_cnt>1 THEN t.Total_Order ELSE 0 END) AS Repeat_Cust_Order,
           SUM(CASE WHEN t.Cust_cnt=1 THEN t.Total_Price ELSE 0 END) AS New_Cust_Order_Total_Price,
           SUM(CASE WHEN t.Cust_cnt>1 THEN t.Total_Price ELSE 0 END) AS Repeat_Cust_OrderTotal_Price,
           t.Last_Order_Date
    FROM (
    SELECT COUNT(Email) AS Cust_cnt,SUM(O_Price) AS Total_Price,COUNT(O_Number) AS Total_Order, MAX(O_Date) AS Last_Order_Date, Email  FROM Orders Group by Email) AS t;
    

    【讨论】:

    • 如何包含日期?
    • 你可以选择maxmin 我在回答中编辑的日期
    • 但是根据您的帖子,您也可以使用order no 代替email
    【解决方案2】:

    使用两个单独的查询,一个用于重复客户,一个用于新客户,然后只需加入他们即可创建您的报告。

    回头客

    SELECT email, COUNT(email), SUM(TotalPrice) as order_count FROM orders GROUP BY email HAVING COUNT(email) > 1
    

    新客户

    SELECT email, SUM(TotalPrice) as order_count FROM orders GROUP BY email HAVING COUNT(email) = 1
    

    如果您使用前端技术来显示这些结果,您也可以在前端将这些结果编译为水平方向(两列而不是两行中的重复和新客户)。如果您想在纯 SQL 中执行此操作,只需 CROSS JOIN 两个查询即可获得输出。

    【讨论】:

    • GROUP BY 子句可能会出错,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“orders.date”
    • @FrustratedDeveloper:啊,是的,删除了它们,因为无论如何输出都不需要它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多