Advertisement
Guest User

Untitled

a guest
Aug 15th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 5.74 KB | None | 0 0
  1. USE [viberu.ru.data01]
  2. GO
  3. /****** Object:  StoredProcedure [dbo].[MergeOffices]    Script Date: 8/15/2019 3:10:38 PM ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. ALTER PROCEDURE [dbo].[MergeOffices]
  9.  
  10. @bankRegNumber int
  11.  
  12. as
  13. declare @bankId uniqueidentifier;
  14.     select @bankId = Id
  15.     from [viberu.ru].[dbo].Banks b
  16.     where
  17.     b.RegNumber = @bankRegNumber and
  18.     b.NotActive = 0
  19.  
  20. declare @outputResult table
  21.     (
  22.         [action] nvarchar(30),
  23.         sNotActive bit,
  24.         rNotActive bit,
  25.         IsCashDispenser bit
  26.     )
  27.  
  28. MERGE [viberu.ru].[dbo].Offices o
  29.  
  30. --В качестве источника мы берём записи сгруппированные по адресу, признаку банкомата, характеристикам банкомата
  31. --и имени. При этом запись для группы берётся первая попавшаяся и выставляется количество элементов в группе.
  32. --Считаем, что остальные поля не так важны, если это допустим банкомат со снятием наличных, то нам важнее знать что их в этом месте просто 2
  33.  
  34. USING  
  35.     (select d.[Id]
  36.            ,d.[BankRegNumber]
  37.            ,d.[Name]
  38.            ,d.[Address]
  39.            ,d.[CanonizedAddress]
  40.            ,d.[Work]
  41.            ,d.[Phone]
  42.            ,d.[IsCashDispenser]
  43.            ,d.[Latitude]
  44.            ,d.[Longitude]
  45.            ,d.[Updated]
  46.            ,d.[UpdatedWithGeocoder]
  47.            ,d.[RoundTheClockAccess]
  48.            ,d.[CashDeposit]
  49.            ,d.[CashWithdrawal]
  50.            ,d.[Payments]
  51.            ,d.[AdditionalInformation]
  52.            ,d.[Province]
  53.            ,d.[City]
  54.            ,d.[Street]
  55.            ,d.[GeocodingFailed]
  56.            ,d.[IsTerminal]
  57.            ,rowNumber
  58.            ,d2.count as count
  59.            , isnull(d.CashWithdrawal, 0) + isnull(d.CashDeposit, 0) * 2 + isnull(d.Payments, 0) * 4 as AtmOperations
  60.            ,d.[Alias]
  61.            ,d.[RegionId]
  62.     from
  63.     (
  64.          select *,
  65.              ROW_NUMBER() over
  66.              (
  67.                  partition by [CanonizedAddress],
  68.                  [IsCashDispenser],
  69.                  [CashDeposit],
  70.                  [CashWithdrawal],
  71.                  [Payments]
  72.                  order by id
  73.              ) as rowNumber
  74.          from  [viberu.ru.data01].[dbo].[BankOffices] bo
  75.          where ISNULL(bo.UpdatedWithGeocoder, 0) = 1 and
  76.               bo.CanonizedAddress LIKE '%[0-9]%' and
  77.               bo.BankRegNumber = @bankRegNumber
  78.     ) as d
  79.     cross apply
  80.         (
  81.             select count(*) count
  82.             from [viberu.ru.data01].[dbo].[BankOffices] _bo
  83.             where
  84.                   _bo.[CanonizedAddress] = d.CanonizedAddress and  
  85.                   _bo.[IsCashDispenser] = d.[IsCashDispenser] and
  86.                   _bo.[CashDeposit] = d.[CashDeposit] and
  87.                   _bo.[CashWithdrawal] = d.[CashWithdrawal] and
  88.                   _bo.[Payments] = d.[Payments] and
  89.                   _bo.[BankRegNumber] = @bankRegNumber
  90.          ) d2
  91.         where d.rowNumber = 1
  92.     ) bo
  93.  
  94.     --главное условие разделения
  95.  
  96.     ON 
  97.         o.[Address] = bo.CanonizedAddress and
  98.         o.[BankId] = @bankId and
  99.         bo.[IsCashDispenser] = o.IsCashDispenser and
  100.         bo.AtmOperations = o.AtmOperations and
  101.         o.NotActive = 0
  102.  
  103.     --записи удовлетворяющие главному условию
  104.  
  105.     WHEN MATCHED THEN
  106.         update set
  107.             [Address] = bo.CanonizedAddress,
  108.             [ExportDbOfficeId] = bo.Id,
  109.             [Name] = bo.Name,
  110.             [WorkInterval] = bo.Work,
  111.             [RoundTheClock] = bo.RoundTheClockAccess,
  112.             [AdditionalInformation] = bo.AdditionalInformation,
  113.             [Updated] = GETDATE(),
  114.             [AtmType] = bo.IsTerminal,
  115.             [Lattitude] = bo.Latitude,
  116.             [Longitude] = bo.Longitude,
  117.             [Count] = bo.count,
  118.             [RegionId] = bo.RegionId
  119.    
  120.     --записи, которые остались в источнике добавляются в основную базу
  121.  
  122.     WHEN NOT MATCHED BY TARGET THEN
  123.         insert(
  124.             [Id],
  125.             [BankId],
  126.             [Name],
  127.             [Address],
  128.             [Phone],
  129.             [IsCashDispenser],
  130.             [WorkInterval],
  131.             [Lattitude],
  132.             [Longitude],
  133.             [Alias],
  134.             [Created],
  135.             [Updated],
  136.             [RoundTheClock],
  137.             [AtmOperations],
  138.             [AtmType],
  139.             [CanonizedAddress],
  140.             [ExportDbOfficeId],
  141.             [AdditionalInformation],
  142.             [TempStreet],
  143.             [Count],
  144.             [RegionId]
  145.         )
  146.         values
  147.         (
  148.             NEWID(),
  149.             @bankId,
  150.             bo.Name,
  151.             bo.CanonizedAddress,
  152.             bo.Phone,
  153.             bo.IsCashDispenser,
  154.             bo.Work,
  155.             bo.Latitude,
  156.             bo.Longitude,
  157.             bo.Alias,
  158.             GETDATE(),
  159.             GETDATE(),
  160.             bo.RoundTheClockAccess,
  161.             bo.AtmOperations,
  162.             bo.IsTerminal,
  163.             1,
  164.             bo.Id,
  165.             bo.AdditionalInformation,
  166.             bo.Street,
  167.             bo.count,
  168.             bo.RegionId
  169.         )
  170.     --не обновлённые в эту итерацию записи будут помечены как не активные
  171.     WHEN NOT MATCHED BY SOURCE and o.[BankId] = @bankId THEN
  172.     update set [NotActive] = 1
  173.     output $action, deleted.[NotActive], inserted.[NotActive], inserted.[IsCashDispenser]
  174.     into @outputResult;
  175.  
  176.     select (
  177.                 select COUNT(*) from @outputResult  
  178.                 where [action] = 'INSERT' and IsCashDispenser = 1
  179.            )
  180.            as [AtmsInserted],
  181.            (
  182.                 select COUNT(*) from @outputResult
  183.                 where [action] = 'INSERT' and IsCashDispenser = 0
  184.            )
  185.            as [DepartmentsInserted],
  186.            (
  187.                 select COUNT(*) from @outputResult
  188.                 where [action] = 'UPDATE' and
  189.                 rNotActive = 0 and
  190.                 sNotActive = 0 and
  191.                 IsCashDispenser = 1
  192.            )
  193.            as [AtmsUpdated],
  194.            (
  195.                 select COUNT(*) from @outputResult
  196.                 where [action] = 'UPDATE' and
  197.                 rNotActive = 0 and
  198.                 sNotActive = 0 and
  199.                 IsCashDispenser = 0
  200.             )
  201.             as [DepartmentsUpdated],
  202.             (
  203.                 select COUNT(*) from @outputResult
  204.                 where [action] = 'UPDATE' and
  205.                 rNotActive = 1 and
  206.                 sNotActive = 0 and
  207.                 IsCashDispenser = 1
  208.             )
  209.             as [AtmsArchived],
  210.             (
  211.                 select COUNT(*) from @outputResult
  212.                 where [action] = 'UPDATE' and
  213.                 rNotActive = 1 and
  214.                 sNotActive = 0 and
  215.                 IsCashDispenser = 0
  216.             )
  217.             as [DepartmentsArchived]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement