2017-04-18 115 views
1

我必须获得客户的订单总数,所有订单的总价值,平均订单价值和电子邮件。从何处到日期和国家我在哪里条款中提到过。 这是我的桌子。 [销售至客户编号]是客户编号。订单总数,总金额和AOV

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' 
+0

提示:'COUNT()','SUM ()','AVG()'。 –

+1

@ Giridhar,你试过什么..? – Mansoor

+0

我已经尝试了count()和sum(),但是因为我对SQL比较困惑。 – jiroe

回答

0

让我们通过什么发生在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 
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_] 

,如果你希望其他列,请通过先得到它,最大,总和....功能取决于你requierment

如果每一个客户都有一个电子邮件在分组值,你可以这样

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_] 
+0

请如何填写电子邮件结果以及。 – jiroe

+0

,这是工作,但我只需要在结果中获得电子邮件。 – jiroe

+0

给我1分钟 – Vecchiasignora