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