订单总数,总金额和AOV
问题描述:
我必须获得客户的订单总数,所有订单的总价值,平均订单价值和电子邮件。从何处到日期和国家我在哪里条款中提到过。 这是我的桌子。 [销售至客户编号]是客户编号。订单总数,总金额和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'
答
让我们通过什么发生在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
答
试试吧
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_]
提示:'COUNT()','SUM ()','AVG()'。 –
@ Giridhar,你试过什么..? – Mansoor
我已经尝试了count()和sum(),但是因为我对SQL比较困惑。 – jiroe