我不知道AdventureWorks
您使用的是哪个版本 - 我在我的(SQL Server 2012 版本)中找不到一CustomerType
列。在我的例子中,客户的类型是在Person.Person
表格上定义的。
我要解决这个问题如下:
- 创建一个 CTE(通用表表达式)来总结个人的销售额,按年份分组
- 创建第二个 CTE 以汇总对企业客户的销售额,按年份分组
一旦有了这两组数据,确定每年的总销售额(这只是两个 CTE 的总和)以及确定个人和企业客户的销售额百分比就变得相当简单了。
这是我的代码 - 适用于AdventureWorks2012
数据库。
-- sales data for individuals, grouped by year
;WITH IndivSalesData AS
(
SELECT
SaleYear = YEAR(oh.OrderDate),
SalesForYear = SUM(od.LineTotal)
FROM
Sales.SalesOrderDetail od
INNER JOIN
Sales.SalesOrderHeader oh ON od.SalesOrderID = oh.SalesOrderID
INNER JOIN
Sales.Customer c ON oh.CustomerID = c.CustomerID
INNER JOIN
Person.Person p ON c.PersonID = p.BusinessEntityID
WHERE
p.PersonType = 'IN'
GROUP BY
YEAR(oh.OrderDate)
),
-- sales data for corporate customers, grouped by year
CorporateSalesData AS
(
SELECT
SaleYear = YEAR(oh.OrderDate),
SalesForYear = SUM(od.LineTotal)
FROM
Sales.SalesOrderDetail od
INNER JOIN
Sales.SalesOrderHeader oh ON od.SalesOrderID = oh.SalesOrderID
INNER JOIN
Sales.Customer c ON oh.CustomerID = c.CustomerID
INNER JOIN
Person.Person p ON c.PersonID = p.BusinessEntityID
WHERE
p.PersonType = 'SC'
GROUP BY
YEAR(oh.OrderDate)
)
-- select the Year, determine total sales, and percentages
SELECT
Indiv.SaleYear,
PercentToIndividuals = Indiv.SalesForYear / (Indiv.SalesForYear + SC.SalesForYear) * 100.0,
PercentToCorporate = SC.SalesForYear / (Indiv.SalesForYear + SC.SalesForYear) * 100.0,
TotalSales = Indiv.SalesForYear + SC.SalesForYear
FROM
IndivSalesData Indiv
INNER JOIN
CorporateSalesData SC ON Indiv.SaleYear = SC.SaleYear
ORDER BY
Indiv.SaleYear
这给了我一个输出:
