每种类型客户的销售额百分比
Percentage of Sales for each type of customer
我想找出每种客户类型的每周销售额百分比。我可以看到数学,但我不知道如何编写查询。
SELECT
c.customerType as 'Customer Type',
DATEPART(WEEK, o.orderDate) as 'Week of the year',
COUNT(c.customerType) as 'Number of sales'
FROM
[dbo].[Order] o
JOIN
Customer c ON c.id = o.customerId
GROUP BY
c.customerType, DATEPART(WEEK, o.orderDate)
此查询输出按客户类型分组的每次销售计数。
CustomerType Week Number of Sales
------------------------------------
Cash 36 248
Corporate 36 10
Personal 36 5
Cash 37 113
Corporate 37 3
Personal 37 2
Cash 38 136
Corporate 38 7
Personal 38 2
Cash 39 138
Corporate 39 4
Personal 39 3
您可以包装查询并使用 window 函数:
select
t.*,
(100.0 * [Number of sales])
/(sum([Number of sales]) over(partition by [Week of the year])
[Percent of Total Sales]
from (
select
c.customerType as [Customer Type],
datepart(week, o.orderDate) as [Week of the year],
count(c.customerType) as [Number of sales],
from [dbo].[Order] o
join Customer c ON c.id = o.customerId
group by c.customerType, datepart(week, o.orderDate), datepart(year, o.orderDate)
) t
备注:
在SQLServer中,最好使用括号而不是引号来定义标识符(引号通常保留给字符串)
100.0
中的 .0
很重要:它强制 SQLServer 执行小数除法(默认情况下它会进行整数除法,这不是你想要的)
我在组的定义中添加了年份;如果您的数据分布在几年内,您可能不希望将不同年份的同一周计算在一起
旁注:SQLServer 在混合 window 函数和聚合方面非常灵活。所以这个可能也有效:
select
c.customerType as [Customer Type],
datepart(week, o.orderDate) as [Week of the year],
count(c.customerType) as [Number of sales],
(100.0 * count(c.customerType))
/ (sum(count(c.customerType)) over(partition by datepart(week, o.orderDate)))
as [Percent of Total Sales]
from [dbo].[Order] o
join Customer c ON c.id = o.customerId
group by c.customerType, datepart(week, o.orderDate), datepart(year, o.orderDate)
我想找出每种客户类型的每周销售额百分比。我可以看到数学,但我不知道如何编写查询。
SELECT
c.customerType as 'Customer Type',
DATEPART(WEEK, o.orderDate) as 'Week of the year',
COUNT(c.customerType) as 'Number of sales'
FROM
[dbo].[Order] o
JOIN
Customer c ON c.id = o.customerId
GROUP BY
c.customerType, DATEPART(WEEK, o.orderDate)
此查询输出按客户类型分组的每次销售计数。
CustomerType Week Number of Sales
------------------------------------
Cash 36 248
Corporate 36 10
Personal 36 5
Cash 37 113
Corporate 37 3
Personal 37 2
Cash 38 136
Corporate 38 7
Personal 38 2
Cash 39 138
Corporate 39 4
Personal 39 3
您可以包装查询并使用 window 函数:
select
t.*,
(100.0 * [Number of sales])
/(sum([Number of sales]) over(partition by [Week of the year])
[Percent of Total Sales]
from (
select
c.customerType as [Customer Type],
datepart(week, o.orderDate) as [Week of the year],
count(c.customerType) as [Number of sales],
from [dbo].[Order] o
join Customer c ON c.id = o.customerId
group by c.customerType, datepart(week, o.orderDate), datepart(year, o.orderDate)
) t
备注:
在SQLServer中,最好使用括号而不是引号来定义标识符(引号通常保留给字符串)
100.0
中的.0
很重要:它强制 SQLServer 执行小数除法(默认情况下它会进行整数除法,这不是你想要的)我在组的定义中添加了年份;如果您的数据分布在几年内,您可能不希望将不同年份的同一周计算在一起
旁注:SQLServer 在混合 window 函数和聚合方面非常灵活。所以这个可能也有效:
select
c.customerType as [Customer Type],
datepart(week, o.orderDate) as [Week of the year],
count(c.customerType) as [Number of sales],
(100.0 * count(c.customerType))
/ (sum(count(c.customerType)) over(partition by datepart(week, o.orderDate)))
as [Percent of Total Sales]
from [dbo].[Order] o
join Customer c ON c.id = o.customerId
group by c.customerType, datepart(week, o.orderDate), datepart(year, o.orderDate)