Thank you Gregory for this clear and concise article.
I cannot resist pitching in some Window function version of the queries;
;WITH CUST_SALES_DETAILS AS
(
SELECT
SSOH.CustomerID
,ROW_NUMBER() OVER
(PARTITION BY SSOH.SalesOrderID ORDER BY (SELECT NULL)) AS SSOH_RID
,COUNT(SSOD.SalesOrderDetailID) OVER
(PARTITION BY SSOH.SalesOrderID) AS COUNT_SSOD
FROM Sales.SalesOrderHeader SSOH
INNER JOIN Sales.SalesOrderDetail SSOD
ON SSOH.SalesOrderID = SSOD.SalesOrderID
)
SELECT
CSD.CustomerID
,CSD.COUNT_SSOD
/* ,DENSE_RANK() OVER (ORDER BY CSD.COUNT_SSOD DESC) AS SALES_RANK */
FROM CUST_SALES_DETAILS CSD
WHERE CSD.SSOH_RID = 1
AND CSD.COUNT_SSOD > 70;
GO
-------------------------------------------
;WITH CUST_SALE_BY_YEAR AS
(
SELECT
SSOH.CustomerID
,ROW_NUMBER() OVER
(PARTITION BY SSOH.CustomerID,YEAR(SSOH.[OrderDate])
ORDER BY (SELECT NULL)) AS CUST_RID
,YEAR(SSOH.[OrderDate]) AS SSOH_YEAR
,SUM(SSOH.SubTotal) OVER
(PARTITION BY SSOH.CustomerID,YEAR(SSOH.[OrderDate])) AS SSOH_SUBTOTAL
,(SUM(SSOH.SubTotal) OVER
(PARTITION BY SSOH.CustomerID,YEAR(SSOH.[OrderDate]))) * (0.10) AS SSOH_REBATE
FROMSales.SalesOrderHeaderSSOH
)
SELECT
CABY.CustomerID
/*
,DENSE_RANK() OVER (PARTITION BY CABY.SSOH_YEAR ORDER BY CABY.SSOH_SUBTOTAL DESC,CABY.SSOH_YEAR DESC) AS SALES_RANK
*/
,CABY.SSOH_YEAR
,CABY.SSOH_SUBTOTAL
,CABY.SSOH_REBATE
FROM CUST_SALE_BY_YEARCABY
WHERE CABY.CUST_RID = 1
AND CABY.SSOH_YEAR = 2008
AND CABY.SSOH_SUBTOTAL > 150000;
GO
-------------------------------------------