# "CustomerAlsoBought" 存储过程

说明：

这个存储过程是客户存储过程中最有趣的部分。它将ProductID作为输入参数。首先，在内部嵌套的SELECT声明中，创建所有具有ProductID的订单. 然后，在这些记录中，返回订单中前五个独特的商品。这个存储过程为commerce starter kit提供了"购买此商品的用户购买的其它商品”（“Customers who bought this item also bought"）功能。

定义：

    	CREATE Procedure CMRC_CustomerAlsoBought
    	(
    		@ProductID int
    	)
    	As

    	/* We want to take the top 5 products contained in
    		the orders where someone has purchased the given Product */
    	SELECT  TOP 5
    		CMRC_OrderDetails.ProductID,
    		CMRC_Products.ModelName,
    		SUM(CMRC_OrderDetails.Quantity) as TotalNum

    	FROM
    		CMRC_OrderDetails
    	INNER JOIN CMRC_Products ON CMRC_OrderDetails.ProductID = CMRC_Products.ProductID

    	WHERE   OrderID IN
    	(
    		/* This inner query should retrieve all orders that have contained the productID */
    		SELECT DISTINCT OrderID
    		FROM CMRC_OrderDetails
    		WHERE ProductID = @ProductID
    	)
    	AND CMRC_OrderDetails.ProductID != @ProductID

    	GROUP BY CMRC_OrderDetails.ProductID, CMRC_Products.ModelName

    	ORDER BY TotalNum DESC

用到的数据库表：

Products: 产品表包含所有关于ASP.NET商务网站的产品信息，它的主键是ProductID。需要说明的是，产品的说明要限定在3800个字符内。

OrderDetails: OrderDetails表包含系统内每个订单的具体产品信息.对于订单内的每个产品, 在OrderDetails表中都为其添加了一个条目，包括ProductID，Quantity和每项产品的当前UnitCost. 在OrderDetails表与Orders表之间有多对一的关系.需要说明的是, 该表的主键是由OrderID and ProductID 组成的复合键（因为这两项是保证记录唯一性的最低要求）。