订单总数,总金额和AOV

时间:2017-04-18 11:12:32

标签: sql sql-server-2012

我必须按客户获得订单总数,所有订单的总价值,平均订单价值和电子邮件。从where -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'  

2 个答案:

答案 0 :(得分:0)

试试吧

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 :(得分:0)

让我们了解SQL聚合中发生的事情。假设您理解对表的引用,以及WHERE子句中发生的事情,我将谈谈聚合函数和GROUP BY。

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

SELECT count(*) FROM MyTable

聚合函数计算表中的所有行。 sum avg 也是聚合。如果要查看表中各种子集的计数,则需要提供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