Advertisement
Guest User

Jonas Claudelin bidrag SQL SM 2017

a guest
Mar 23rd, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 10.67 KB | None | 0 0
  1. ---Jonas Claudelin, Hypergene, 2017-03-14 (insickat)
  2. ---SQL SM 2017 - TWO
  3.  
  4.  
  5. if object_id('dbo.CustomerWorkTable') Is not null drop table dbo.CustomerWorkTable
  6. go
  7. if object_id('dbo.Purchases2') Is not null drop table [dbo].[Purchases2]
  8. go
  9. if object_id('dbo.Customer1') Is not null drop table [dbo].Customer1
  10. go
  11. if object_id('dbo.Customer2') Is not null drop table [dbo].Customer2
  12. go
  13. if object_id('dbo.Customer3') Is not null drop table [dbo].Customer3
  14. go
  15.  
  16. --Arbetstabell
  17. CREATE TABLE dbo.CustomerWorkTable (
  18.     [CustomerID] INT  not null PRIMARY KEY NONCLUSTERED, ---kommer innehålla alla purchaseid
  19.     [CustomerID1] INT not null, --för matchning 1
  20.     [CustomerID2] INT not null, --för matchning 2
  21.     [CustomerID3] INT not null, --för matchning 3
  22.     [FirstName] [varchar](50) NOT NULL,
  23.     [LastName] [varchar](50) NOT NULL,
  24.     [Email] [varchar](50) NOT NULL,
  25.     [StreetAddress] [varchar](50) NOT NULL,
  26.     [ZipCode] [int] NOT NULL,
  27.     [CreditCard] [char](19) NOT NULL,
  28.     [PurchaseID] INT  not null --,
  29.     ,loopnr char(10) not null
  30. ) WITH (MEMORY_OPTIMIZED=ON, durability = schema_only)
  31. GO
  32.  
  33. --In-memorytabell för att snabba upp
  34. CREATE TABLE [dbo].[Purchases2](
  35.     [PurchaseID] [int] NOT NULL PRIMARY KEY NONCLUSTERED,
  36.     [Date] [date] NOT NULL,
  37.     [FirstName] [varchar](50)  COLLATE Finnish_Swedish_100_BIN2 NOT NULL,
  38.     [LastName] [varchar](50) COLLATE Finnish_Swedish_100_BIN2  NOT NULL,
  39.     [Email] [varchar](50)  COLLATE Finnish_Swedish_100_BIN2 NOT NULL,
  40.     [StreetAddress] [varchar](50) COLLATE Finnish_Swedish_100_BIN2  NOT NULL,
  41.     [ZipCode] [int] NOT NULL,
  42.     [CreditCard] [char](19)  COLLATE Finnish_Swedish_100_BIN2 NOT NULL,
  43.     loopnr INT not null  INDEX IX_loopnr (loopnr ASC),
  44. ) WITH (MEMORY_OPTIMIZED=ON, durability = schema_only)
  45. GO
  46.  
  47.  
  48. -----Hålla koll på kunder och gilltiga identifieringar av dessa, en för varje identifieringstyp
  49. CREATE TABLE [dbo].[Customer1](
  50.     [CustomerID] [int] NOT NULL,
  51.     [FirstName] [varchar](50) COLLATE Finnish_Swedish_100_BIN2 NOT NULL,
  52.     [CreditCard] [char](19) COLLATE Finnish_Swedish_100_BIN2 NOT NULL
  53.  PRIMARY KEY NONCLUSTERED
  54. (
  55.     [CustomerID] ASC,
  56.     [FirstName] ASC,
  57.     [CreditCard] ASC
  58. )
  59. ) WITH (MEMORY_OPTIMIZED=ON, durability = schema_only) --kan inte ha in memory på viss typ av text kolumner
  60. GO
  61.  
  62. CREATE TABLE [dbo].[Customer2](
  63.     [CustomerID] [int] NOT NULL,
  64.     [FirstName] [varchar](50) COLLATE Finnish_Swedish_100_BIN2  NOT NULL,
  65.     [Email] [varchar](50) COLLATE Finnish_Swedish_100_BIN2  NOT NULL
  66. PRIMARY KEY NONCLUSTERED
  67. (
  68.     [CustomerID] ASC,
  69.     [FirstName] ASC,
  70.     [Email] ASC
  71. )
  72. ) WITH (MEMORY_OPTIMIZED=ON, durability = schema_only)
  73. GO
  74.  
  75. CREATE TABLE [dbo].[Customer3](
  76.     [CustomerID] [int] NOT NULL ,
  77.     [FirstName] [varchar](50) COLLATE Finnish_Swedish_100_BIN2 NOT NULL,
  78.     [LastName] [varchar](50) COLLATE Finnish_Swedish_100_BIN2  NOT NULL,
  79.     [StreetAddress] [varchar](50) COLLATE Finnish_Swedish_100_BIN2  NOT NULL,
  80.     [ZipCode] [int] NOT NULL
  81. PRIMARY KEY NONCLUSTERED
  82. (
  83.     [CustomerID] ASC,
  84.     [FirstName] ASC,
  85.     [LastName] ASC,
  86.     [StreetAddress] ASC,
  87.     [ZipCode] ASC
  88. )
  89. ) WITH (MEMORY_OPTIMIZED=ON, durability = schema_only)
  90. GO
  91.  
  92. ---Fyller in-memory tabell
  93. INSERT INTO [dbo].[Purchases2]
  94.            ([PurchaseID]
  95.            ,[Date]
  96.            ,[FirstName]
  97.            ,[LastName]
  98.            ,[Email]
  99.            ,[StreetAddress]
  100.            ,[ZipCode]
  101.            ,[CreditCard]
  102.            ,[loopnr])
  103. select [PurchaseID]
  104.            ,[Date]
  105.            ,[FirstName]
  106.            ,[LastName]
  107.            ,[Email]
  108.            ,[StreetAddress]
  109.            ,[ZipCode]
  110.            ,[CreditCard]
  111.             ,CAST(LEFT(CONVERT(CHAR(8),[Date],112),6)+'01' AS int) as loopnr ---ger ett löpmånad per unik yearmonth
  112. from [dbo].[Purchases]
  113.  
  114.  
  115.  
  116. --Unika köp per månad, kör månads batch.
  117. DECLARE @month int
  118. DECLARE @count int
  119. SELECT @month=MIN(loopnr) FROM [dbo].[Purchases2] --hur många gången vi ska loopa
  120. SELECT @count=MAX(loopnr) FROM [dbo].[Purchases2] --hur många gången vi ska loopa
  121.  
  122. ---Första inserten, för att få customerId (vi vet att det är unika kunder inom en månad)
  123. ---även in i koppling purchaseId - customerid
  124. INSERT INTO [dbo].[CustomerWorkTable]
  125.            ([CustomerID]
  126.            ,[CustomerID1]
  127.            ,[CustomerID2]
  128.            ,[CustomerID3]
  129.            ,[FirstName]
  130.            ,[LastName]
  131.            ,[Email]
  132.            ,[StreetAddress]
  133.            ,[ZipCode]
  134.            ,[CreditCard]
  135.            ,[PurchaseID]
  136.            ,loopnr
  137.            )
  138. SELECT      [PurchaseID] AS [CustomerID] ---första PurchaseID används som customerID
  139.             ,-1 AS [CustomerID1]
  140.             ,-1 AS [CustomerID2]
  141.             ,-1 AS [CustomerID3]
  142.             ,[FirstName]
  143.            ,[LastName]
  144.            ,[Email]
  145.            ,[StreetAddress]
  146.            ,[ZipCode]
  147.            ,[CreditCard]
  148.            ,[PurchaseID]
  149.            ,loopnr
  150. FROM [dbo].[Purchases2] WHERE loopnr=@month
  151.  
  152. INSERT INTO [dbo].[Customer1]
  153.            ([CustomerID]
  154.            ,[FirstName]
  155.            ,[CreditCard])
  156. SELECT      [PurchaseID] AS [CustomerID] ---första PurchaseID används som customerID
  157.             ,[FirstName]
  158.            ,[CreditCard]
  159. FROM [dbo].[Purchases2] WHERE loopnr=@month
  160.  
  161.  
  162. INSERT INTO [dbo].[Customer2]
  163.            ([CustomerID]
  164.            ,[FirstName]
  165.            ,[Email])
  166. SELECT      [PurchaseID] AS [CustomerID] ---första PurchaseID används som customerID
  167.             ,[FirstName]
  168.            ,[Email]
  169. FROM [dbo].[Purchases2] WHERE loopnr=@month
  170.  
  171. INSERT INTO [dbo].[Customer3]
  172.            ([CustomerID]
  173.            ,[FirstName]
  174.            ,[LastName]
  175.            ,[StreetAddress]
  176.            ,[ZipCode])
  177. SELECT      [PurchaseID] AS [CustomerID] ---första PurchaseID används som customerID
  178.             ,[FirstName]
  179.            ,[LastName]
  180.            ,[StreetAddress]
  181.            ,[ZipCode]
  182. FROM [dbo].[Purchases2] WHERE loopnr=@month
  183.  
  184. ---Nu har vi nått att utgå ifrån. Loopa igenom hela [dbo].[Purchases], månad för månad
  185. --Unika köp per månad, kör månads batch.
  186.  
  187. SET @month= CAST(CONVERT(CHAR(8),DATEADD(M,1,CAST(LEFT(@month,4) AS char(4))+'-'+CAST(RIGHT(LEFT(@month,6),2) AS char(2))+'-'+CAST(RIGHT(@month,2) AS char(2))),112) AS int)
  188.  
  189. WHILE @month<=@count
  190. BEGIN
  191.  
  192. INSERT INTO [dbo].[CustomerWorkTable]
  193.            ([CustomerID]
  194.            ,[CustomerID1]
  195.            ,[CustomerID2]
  196.            ,[CustomerID3]
  197.            ,[FirstName]
  198.            ,[LastName]
  199.            ,[Email]
  200.            ,[StreetAddress]
  201.            ,[ZipCode]
  202.            ,[CreditCard]
  203.            ,[PurchaseID]
  204.            ,loopnr
  205.            )
  206. --Kommer skapa en ny rad för varje köp.
  207. (SELECT
  208. A.[PurchaseID] AS [CustomerID]
  209. ,MIN(ISNULL(T1.CustomerID,-1)) AS CustomerID1
  210. ,MIN(ISNULL(T2.CustomerID,-1)) AS CustomerID2
  211. ,MIN(ISNULL(T3.CustomerID,-1)) AS CustomerID3
  212. --Antingen samma kund, eller ny
  213. ,A.[FirstName]
  214. ,A.[LastName]
  215. ,A.[Email]
  216. ,A.[StreetAddress]
  217. ,A.[ZipCode]
  218. ,A.[CreditCard]
  219. ,A.[PurchaseID]
  220. ,A.loopnr
  221. FROM
  222. (SELECT PurchaseID, [Date], FirstName, LastName, Email, StreetAddress, ZipCode, CreditCard,loopnr
  223. FROM [dbo].[Purchases2]
  224. WHERE loopnr =@month
  225. ) AS A
  226. --En join per villkor
  227. LEFT JOIN [dbo].[Customer1] AS T1
  228. ON A.FirstName=T1.FirstName
  229. AND A.CreditCard=T1.CreditCard
  230. LEFT JOIN [dbo].[Customer2] AS T2
  231. ON A.FirstName=T2.FirstName
  232. AND A.Email=T2.Email
  233. LEFT JOIN [dbo].[Customer3] AS T3
  234. ON A.FirstName=T3.FirstName
  235. AND A.LastName=T3.LastName
  236. AND A.StreetAddress=T3.StreetAddress
  237. AND A.ZipCode=T3.ZipCode
  238. GROUP BY A.[PurchaseID]
  239. ,A.[FirstName]
  240. ,A.[LastName]
  241. ,A.[Email]
  242. ,A.[StreetAddress]
  243. ,A.[ZipCode]
  244. ,A.[CreditCard]
  245. ,A.[PurchaseID]
  246. ,A.loopnr
  247. ) --END INSERT
  248.  
  249. INSERT INTO [dbo].[Customer1]
  250.            ([CustomerID]
  251.            ,[FirstName]
  252.            ,[CreditCard])
  253. SELECT      CASE WHEN [CustomerID1]=-1 AND CustomerID2=-1 AND CustomerID3=-1 THEN [CustomerID]
  254.               WHEN CustomerID1<>-1 AND CustomerID1<=IIF(CustomerID2=-1,CustomerID1,CustomerID2) AND CustomerID1<=IIF(CustomerID3=-1,CustomerID1,CustomerID3) THEN CustomerID1
  255.               WHEN CustomerID2<>-1 AND CustomerID2<=IIF(CustomerID1=-1,CustomerID2,CustomerID1) AND CustomerID2<=IIF(CustomerID3=-1,CustomerID2,CustomerID3) THEN CustomerID2
  256.               WHEN CustomerID3<>-1 AND CustomerID3<=IIF(CustomerID1=-1,CustomerID3,CustomerID1) AND CustomerID3<=IIF(CustomerID2=-1,CustomerID3,CustomerID2) THEN CustomerID3
  257.               ELSE -1 END AS [CustomerID]
  258.             ,[FirstName]
  259.            ,[CreditCard]
  260. FROM [dbo].[CustomerWorkTable] WHERE loopnr=@month
  261. AND CustomerID1=-1
  262.  
  263.  
  264. INSERT INTO [dbo].[Customer2]
  265.            ([CustomerID]
  266.            ,[FirstName]
  267.            ,[Email])
  268. SELECT      CASE WHEN [CustomerID1]=-1 AND CustomerID2=-1 AND CustomerID3=-1 THEN [CustomerID]
  269.               WHEN CustomerID1<>-1 AND CustomerID1<=IIF(CustomerID2=-1,CustomerID1,CustomerID2) AND CustomerID1<=IIF(CustomerID3=-1,CustomerID1,CustomerID3) THEN CustomerID1
  270.               WHEN CustomerID2<>-1 AND CustomerID2<=IIF(CustomerID1=-1,CustomerID2,CustomerID1) AND CustomerID2<=IIF(CustomerID3=-1,CustomerID2,CustomerID3) THEN CustomerID2
  271.               WHEN CustomerID3<>-1 AND CustomerID3<=IIF(CustomerID1=-1,CustomerID3,CustomerID1) AND CustomerID3<=IIF(CustomerID2=-1,CustomerID3,CustomerID2) THEN CustomerID3
  272.               ELSE -1 END AS [CustomerID]
  273.             ,[FirstName]
  274.            ,[Email]
  275. FROM [dbo].[CustomerWorkTable] WHERE loopnr=@month
  276. AND CustomerID2=-1
  277.  
  278. INSERT INTO [dbo].[Customer3]
  279.            ([CustomerID]
  280.            ,[FirstName]
  281.            ,[LastName]
  282.            ,[StreetAddress]
  283.            ,[ZipCode])
  284. SELECT      CASE WHEN [CustomerID1]=-1 AND CustomerID2=-1 AND CustomerID3=-1 THEN [CustomerID]
  285.               WHEN CustomerID1<>-1 AND CustomerID1<=IIF(CustomerID2=-1,CustomerID1,CustomerID2) AND CustomerID1<=IIF(CustomerID3=-1,CustomerID1,CustomerID3) THEN CustomerID1
  286.               WHEN CustomerID2<>-1 AND CustomerID2<=IIF(CustomerID1=-1,CustomerID2,CustomerID1) AND CustomerID2<=IIF(CustomerID3=-1,CustomerID2,CustomerID3) THEN CustomerID2
  287.               WHEN CustomerID3<>-1 AND CustomerID3<=IIF(CustomerID1=-1,CustomerID3,CustomerID1) AND CustomerID3<=IIF(CustomerID2=-1,CustomerID3,CustomerID2) THEN CustomerID3
  288.               ELSE -1 END AS [CustomerID]
  289.             ,[FirstName]
  290.            ,[LastName]
  291.            ,[StreetAddress]
  292.            ,[ZipCode]
  293. FROM [dbo].[CustomerWorkTable] WHERE loopnr=@month
  294. AND CustomerID3=-1
  295.  
  296. --Räknar upp för ett nytt varv
  297. SET @month= CAST(CONVERT(CHAR(8),DATEADD(M,1,CAST(LEFT(@month,4) AS char(4))+'-'+CAST(RIGHT(LEFT(@month,6),2) AS char(2))+'-'+CAST(RIGHT(@month,2) AS char(2))),112) AS int)
  298.  
  299. END ---loop med ny month
  300.  
  301. ---Loop slut
  302. TRUNCATE TABLE [dbo].[Customers] --behövs ej i tävlingen
  303.  
  304. --spara resultat
  305. INSERT INTO [dbo].[Customers]
  306.            ([PurchaseID]
  307.            ,[CustomerID])
  308. SELECT [PurchaseID]
  309. ,CASE
  310.       WHEN [CustomerID1]=-1 AND CustomerID2=-1 AND CustomerID3=-1 THEN [CustomerID]
  311.    
  312.       WHEN [CustomerID1]<>-1
  313.             THEN [CustomerID1]
  314.       WHEN [CustomerID2]<>-1
  315.             THEN [CustomerID2]
  316.       WHEN [CustomerID3]<>-1  
  317.             THEN [CustomerID3]
  318.       ELSE -1 --NÅTT ÄR FEL!
  319.       END AS [CustomerID]
  320. FROM [dbo].[CustomerWorkTable]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement