Sql 在使用NORTHWND计算每个产品类别的总订单时,无法使用公共表表达式

Sql 在使用NORTHWND计算每个产品类别的总订单时,无法使用公共表表达式,sql,sql-server,tsql,aggregate-functions,common-table-expression,Sql,Sql Server,Tsql,Aggregate Functions,Common Table Expression,伙计们,作为我作为一名数据支持分析师工作的一部分,我正在接受培训,准备成为一名软件开发人员。我的导师给了我一组测试声明,这一条似乎比我以前做过的任何事情都要先进。问题是 * 6) 编写子查询或公共表表达式以计算总计 每个产品类别的订单。这将编写一个查询,该查询将 带回每种产品的名称,以及该产品的订单总数 product并连接到子查询或CTE以计算百分比 该产品代表其产品类别的销售额。例如 如果肥皂类别有2种产品;蓝色汤和红色肥皂,蓝色汤 有40份订单,红色肥皂有10份订单,我希望看到 以下行:产

伙计们,作为我作为一名数据支持分析师工作的一部分,我正在接受培训,准备成为一名软件开发人员。我的导师给了我一组测试声明,这一条似乎比我以前做过的任何事情都要先进。问题是

*

6) 编写子查询或公共表表达式以计算总计 每个产品类别的订单。这将编写一个查询,该查询将 带回每种产品的名称,以及该产品的订单总数 product并连接到子查询或CTE以计算百分比 该产品代表其产品类别的销售额。例如 如果肥皂类别有2种产品;蓝色汤和红色肥皂,蓝色汤 有40份订单,红色肥皂有10份订单,我希望看到 以下行:产品名称总订单占红色类别的百分比 肥皂40 80%
蓝色肥皂10.20%

*

到目前为止,我已经设法做到了以下几点,但我正在努力克服这一点

;WITH [Products] (CategoryId, TotalNumberOfOrders) 
AS  (

SELECT p.CategoryId, 
COUNT (OD.OrderID) as TotalNumberOfOrders
FROM [dbo].[Products] p  
INNER JOIN [dbo].[Order Details] OD 
ON p.ProductID=OD.ProductID
GROUP BY p.CategoryId )

SELECT * From Products

任何帮助都会很棒!(顺便说一句,我正在使用NORTHWND数据库)

我想你需要的是

;WITH temp    AS  
(
   SELECT p.CategoryId, 
          COUNT (DISTINCT OD.OrderID) as TotalNumberOfOrders
   FROM [dbo].[Products] p  
   INNER JOIN [dbo].[Order Details] OD  ON p.ProductID=OD.ProductID
   GROUP BY p.CategoryId
)

SELECT p.ProductName, 
       Count(DISTINCT Od.OrderId) AS Total, 
       Count(DISTINCT Od.OrderId)*100/temp.TotalNumberOfOrders AS Percentage
FROM Products p
INNER JOIN [dbo].[Order Details] OD ON p.ProductId = OD.ProductId
INNER JOIN temp ON p.CategoryId = temp.CategoryId 
GROUP BY p.ProductId, p.ProductName, temp.TotalNumberOfOrders
记住
Count(Distinct..)
使用子查询对订单进行计数:

SELECT  P.ProductName, 
      COUNT(OrderID) AS NumberOfOrders,     
      CAST((CAST(COUNT(OrderID) AS DECIMAL(9,2)) / CAST(Derived_Table.CNT AS 
DECIMAL(9,2))) * 100 AS DECIMAL(9,2)) AS Percentage
  FROM [Northwind].[dbo].[Order Details]
        INNER JOIN  dbo.Products AS P
                ON  [Order Details].ProductID = P.ProductID  
        INNER JOIN (SELECT COUNT(F.OrderID) AS CNT, P.CategoryID
                            FROM [Northwind].[dbo].[Order Details] F
                    INNER JOIN dbo.Products P
                    ON F.ProductID = P.ProductID
                    GROUP BY P.CategoryID) AS Derived_Table
                ON P.CategoryID = Derived_Table.CategoryID                  
  GROUP BY [Order Details].ProductID,  P.ProductName, Derived_Table.CNT
 ORDER BY [Order Details].ProductID