-1

我正在尝试在 AdventureWorks 中构建以下查询:

我们每年的销售额(销售价值)中有哪些部分与个人客户相关,哪些部分用于商店?结果列应如下所示,并应按年份排序:

Year, Percents of sale to Individuals, Percents of sale to stores, Total value of sale

知道怎么做吗?

到目前为止,这是我为个人所做的,我不确定它是否正确。

   SELECT
   c.CustomerType,
   YEAR(oh.OrderDate) AS 'Year',
   SUM(od.LineTotal) AS 'Sale in year'

   FROM Sales.SalesOrderDetail od 
   INNER JOIN Sales.SalesOrderHeader oh ON od.SalesOrderID = oh.SalesOrderID
   INNER JOIN Sales.Customer c ON oh.CustomerID = c.CustomerID

   GROUP BY
   YEAR(oh.OrderDate),
   c.CustomerType 

   ORDER BY YEAR(oh.OrderDate) ASC

这是输出。我只是不知道如何达到
那一年,个人销售百分比,商店销售百分比,销售总价值

4

1 回答 1

2

我不知道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

这给了我一个输出:

在此处输入图像描述

于 2013-11-02T10:58:04.100 回答