Advertisement
LarsOve

LOs bidrag till SQLUG Challenge 2017

Mar 23rd, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 2.97 KB | None | 0 0
  1. CREATE TABLE #ForceBatch(dummy INT NOT NULL, INDEX idx_cs CLUSTERED COLUMNSTORE);
  2. CREATE TABLE #FirstPurchases
  3. (
  4.     PurchaseID INT NOT NULL
  5.     ,FirstName VARCHAR(50) NOT NULL
  6.     ,ZipCode INT NOT NULL
  7.     ,StreetAddress VARCHAR(50) NOT NULL
  8.     ,LastName VARCHAR(50) NOT NULL
  9.     ,CreditCard CHAR(19) NOT NULL
  10.     ,Email VARCHAR(50) NOT NULL
  11.     ,CustomerID INT NULL
  12. )
  13.  
  14.  
  15. INSERT INTO #FirstPurchases WITH (TABLOCK) (PurchaseID, FirstName, ZipCode, StreetAddress, LastName, CreditCard, Email, CustomerID)
  16.     SELECT
  17.         MIN(PurchaseID) AS PurchaseID
  18.         ,Firstname
  19.         ,ZipCode
  20.         ,StreetAddress
  21.         ,LastName
  22.         ,CreditCard
  23.         ,Email
  24.         ,NULL AS CustomerID
  25.      FROM
  26.         dbo.Purchases
  27.         LEFT JOIN #ForceBatch ON 1=2
  28.     GROUP BY
  29.         Firstname
  30.         ,ZipCode
  31.         ,StreetAddress
  32.         ,LastName
  33.         ,CreditCard
  34.         ,Email
  35.  
  36. DECLARE @Count INT = @@ROWCOUNT
  37.  
  38. UPDATE
  39.     c
  40. SET
  41.     c.CustomerID = p.PurchaseID
  42. FROM
  43.     (SELECT MIN(PurchaseID) AS PurchaseID FROM #FirstPurchases GROUP BY FirstName) AS n
  44.  
  45.     INNER JOIN #FirstPurchases AS p
  46.     ON n.PurchaseID = p.PurchaseID
  47.  
  48.     INNER JOIN #FirstPurchases AS c
  49.     ON  c.PurchaseID >= p.PurchaseID
  50.         AND c.FirstName = p.FirstName
  51.         AND (c.ZipCode = p.ZipCode AND c.StreetAddress = p.StreetAddress AND c.LastName = p.LastName OR c.CreditCard = p.CreditCard OR c.Email = p.Email)
  52.  
  53. SET @Count = @Count - @@ROWCOUNT
  54. WHILE @Count > 0
  55. BEGIN
  56.     UPDATE
  57.         c
  58.     SET
  59.         c.CustomerID = p.CustomerID
  60.     FROM
  61.         (
  62.             SELECT
  63.                 p.PurchaseID
  64.                 ,p.Firstname
  65.                 ,p.ZipCode
  66.                 ,p.StreetAddress
  67.                 ,p.LastName
  68.                 ,p.CreditCard
  69.                 ,p.Email
  70.                 ,MIN(CASE WHEN c.CustomerID IS NULL THEN p.PurchaseID ELSE c.CustomerID END) AS CustomerID
  71.             FROM
  72.                 (SELECT MIN(PurchaseID) AS PurchaseID FROM #FirstPurchases WHERE CustomerID IS NULL GROUP BY FirstName) AS n
  73.  
  74.                 INNER JOIN #FirstPurchases AS p
  75.                 ON n.PurchaseID = p.PurchaseID
  76.            
  77.                 INNER JOIN #FirstPurchases AS c
  78.                 ON  c.PurchaseID <= p.PurchaseID
  79.                     AND c.FirstName = p.FirstName
  80.                     AND (c.ZipCode = p.ZipCode AND c.StreetAddress = p.StreetAddress AND c.LastName = p.LastName OR c.CreditCard = p.CreditCard OR c.Email = p.Email)
  81.             GROUP BY
  82.                 p.PurchaseID
  83.                 ,p.ZipCode
  84.                 ,p.CreditCard
  85.                 ,p.Firstname
  86.                 ,p.StreetAddress
  87.                 ,p.LastName
  88.                 ,p.Email
  89.         ) AS p
  90.  
  91.         INNER JOIN #FirstPurchases AS c
  92.         ON  c.PurchaseID >= p.PurchaseID
  93.             AND c.FirstName = p.FirstName
  94.             AND (c.ZipCode = p.ZipCode AND c.StreetAddress = p.StreetAddress AND c.LastName = p.LastName OR c.CreditCard = p.CreditCard OR c.Email = p.Email)
  95.     WHERE
  96.         c.CustomerID IS NULL
  97.  
  98.     SET @Count = @Count - @@ROWCOUNT
  99. END
  100.  
  101. INSERT INTO dbo.Customers WITH (TABLOCK) (PurchaseID, CustomerID)
  102.     SELECT
  103.         c.PurchaseID
  104.         ,p.CustomerID
  105.     FROM
  106.         dbo.Purchases AS c
  107.         LEFT JOIN #ForceBatch ON 1=2
  108.  
  109.         INNER JOIN #FirstPurchases AS p
  110.         ON  c.FirstName = p.FirstName
  111.             AND c.ZipCode = p.ZipCode AND c.CreditCard = p.CreditCard AND c.LastName = p.LastName AND c.StreetAddress = p.StreetAddress AND c.Email = p.Email
  112.  
  113. DROP TABLE #FirstPurchases
  114. DROP TABLE #ForceBatch
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement