пятница, 29 марта 2013 г.

Как найти потерянных клиентов (отток клиентов)


-- Как найти клиентов, сделавших заказ в предыдущий период, но не сделавших в текущем периоде


-- Пример: клиенты, сделавшие заказ в 2006 году, но не сделавшие в 2007

USE AdventureWorks2012

SELECT -- Клиенты 2006 года
    CustomerID
FROM AdventureWorks2012.Sales.SalesOrderHeader AS OH
WHERE YEAR(OrderDate) = 2006
    EXCEPT --кроме (за вычетомклиентов 2007
SELECT
    CustomerID
FROM AdventureWorks2012.Sales.SalesOrderHeader AS OH
WHERE YEAR(OrderDate) = 2007

-- По номерам клиентов выведем имена клиентов

;WITH LostCustomers -- Обобщенное табличное выражение, содержащие CustomerID потерянных клиентов
AS
(
-- Клиенты 2006 года
    SELECT
         CustomerID
    FROM AdventureWorks2012.Sales.SalesOrderHeader AS OH
    WHERE YEAR(OrderDate) = 2006
         EXCEPT --кроме (за вычетомклиентов 2007
    SELECT
         CustomerID
    FROM AdventureWorks2012.Sales.SalesOrderHeader AS OH
    WHERE YEAR(OrderDate) = 2007
)
SELECT
     P.LastName AS "Фамилия"
     ,P.FirstName AS "Имя"
     ,L.CustomerID AS "ID Клиента"
FROM LostCustomers AS L
         LEFT JOIN
     AdventureWorks2012.Sales.Customer AS C
ON L.CustomerID = C.CustomerID
         LEFT JOIN
    AdventureWorks2012.Person.Person AS P
ON C.PersonID = P.BusinessEntityID
ORDER BY P.LastName, P.FirstName