【问题标题】:Total number of Orders,Total amount and AOV订单总数、总金额和AOV
【发布时间】:2017-04-18 11:12:32
【问题描述】:

我必须按客户获取订单总数、所有订单的总价值、平均订单价值和电子邮件。 where from -to 日期和我在 where 子句中提到的国家/地区。 这是我的桌子。 [Sell-to Customer No_] 是客户 ID。

   SELECT 

   [Sell-to Customer No_]
  ,[Bill-to Name]
  ,[Order Date]
  ,[Amount]
  ,[Original Order No_]
  ,[Country]
  ,[Email]
  FROM [TBW_BI].[dbo].[Dreams$Internet Orders]
  WHERE [Country]='RUSSIA' and 
  [order date] >= '2016-11-18T00:00:00.000' AND 
  [order date] <= '2017-04-10T00:00:00.000'  

【问题讨论】:

  • 提示:COUNT()SUM()AVG()
  • @Giridhar,你尝试了什么..?
  • 我已经尝试过 count() 和 sum() 但因为我是 SQL 新手,所以有点困惑。

标签: sql sql-server-2012


【解决方案1】:

让我们来看看 SQL 聚合中发生了什么。假设您了解对表的引用,以及 WHERE 子句中发生了什么,我将只讨论 聚合 函数和 GROUP BY。

聚合是相当简单的函数,可在分组之前应用于查询中的所有行。所以换句话说,如果你写一个这样的查询:

SELECT count(*) FROM MyTable

聚合函数计算表中的所有行。 sumavg 也是聚合。如果要查看表中各个子集的计数,则需要提供 GROUP BY 限定符。这会更改聚合以计算每封电子邮件的行数。

SELECT email, count(*) FROM MyTable GROUP BY email

请注意,我们必须在 SELECT 以及 GROUP BY 中明确引用电子邮件。

所以要回答你的问题,我认为你需要这样的查询。

SELECT 
    [Email]
  , COUNT(*)                AS order_count
  , SUM([Amount])           AS total_amount
  , AVG([Amount])           AS avg_amount
FROM 
  [TBW_BI].[dbo].[Dreams$Internet Orders]
WHERE 
  [Country]='RUSSIA' 
  AND [order date] >= '2016-11-18T00:00:00.000'
  AND [order date] <= '2017-04-10T00:00:00.000' 
GROUP BY
  [Email]

需要注意的另一件事是在聚合之前应用 WHERE,因此它不能用于过滤分组结果。如果您需要执行过滤到超过 2 个订单的电子邮件之类的操作,您可以在查询的最后添加一个 HAVING 子句,如下所示:

...
HAVING
  count(*) >= 2

【讨论】:

    【解决方案2】:

    试试看

    SELECT 
    
       [Sell-to Customer No_]
      ,Count(*)
      ,Sum([Amount])
      ,AVG([Amount])
      FROM [TBW_BI].[dbo].[Dreams$Internet Orders]
      WHERE [Country]='RUSSIA' and 
      [order date] >= '2016-11-18T00:00:00.000' AND 
      [order date] <= '2017-04-10T00:00:00.000'  
    group by [Sell-to Customer No_]
    

    如果您想要其他列,请通过 first、max、sum.... 功能取决于您的要求

    如果每个客户在您的分组值中都有一封电子邮件,您可以添加这样的列

    SELECT 
    
           [Sell-to Customer No_]
          ,[Email]
          ,Count(*)
          ,Sum([Amount])
          ,AVG([Amount])
          FROM [TBW_BI].[dbo].[Dreams$Internet Orders]
          WHERE [Country]='RUSSIA' and 
          [order date] >= '2016-11-18T00:00:00.000' AND 
          [order date] <= '2017-04-10T00:00:00.000'  
        group by [Sell-to Customer No_], [Email]
    

    如果不是,例如您想显示来自分组值的第一封电子邮件,您可以像这样使用first_value

    SELECT 
    
           [Sell-to Customer No_]
          ,FIRST_VALUE([Email]) over (partition by [Sell-to Customer No_] order by [Sell-to Customer No_] ) as Email
          ,Count(*)
          ,Sum([Amount])
          ,AVG([Amount])
          FROM [TBW_BI].[dbo].[Dreams$Internet Orders]
          WHERE [Country]='RUSSIA' and 
          [order date] >= '2016-11-18T00:00:00.000' AND 
          [order date] <= '2017-04-10T00:00:00.000'  
        group by [Sell-to Customer No_]
    

    【讨论】:

    • 请如何在结果中填写电子邮件。
    • ,它正在工作,但我只需要在结果中也收到电子邮件。
    • 给我1分钟
    • 我的答案改了,请看
    • 谢谢 Mikuana,@Vecchiasignora 都运行良好。你们太神奇了。
    猜你喜欢
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2012-11-29
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多