Guest User

Untitled

a guest
Jul 18th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.58 KB | None | 0 0
  1. DECLARE @Employee TABLE
  2. (
  3. [Employee_Id] INT IDENTITY(1, 1)
  4. , [Code] NVARCHAR(10)
  5. ) ;
  6.  
  7. INSERT INTO @Employee
  8. VALUES ( N'E1' ), ( N'E2' ), ( N'E3' ) ;
  9.  
  10. DECLARE @Contact TABLE
  11. (
  12. [Employee_Id] INT
  13. , [PhoneType] CHAR(1)
  14. , [PhoneNumber] VARCHAR(20)
  15. , [IsMainNumber] BIT
  16. ) ;
  17.  
  18. INSERT INTO @Contact
  19. VALUES (1, 'M', '1234567890', 1), (1, 'H', '1234567891', 0),
  20. (1, 'M', '1234567892', 0), (1, 'B', '1234567893', 0),
  21. (2, 'M', '2234567890', 0), (2, 'H', '2234567891', 1),
  22. (2, 'B', '2234567892', 0), (2, 'M', '2234567893', 0),
  23. (3, 'M', '3234567890', 0), (3, 'H', '3234567891', 0),
  24. (3, 'M', '3234567892', 0), (3, 'B', '3234567893', 1);
  25.  
  26. SELECT
  27. [E].[Employee_Id],
  28. [E].[Code],
  29. [COA].[MainPhoneNumber],
  30. [COA].[NonMainNumber]
  31. FROM
  32. @Employee AS [E]
  33. OUTER APPLY
  34. (SELECT
  35. MAX (IIF([C].[IsMainNumber] = 1, [C].[PhoneNumber], NULL)) [MainPhoneNumber],
  36. MAX (IIF([C].[IsMainNumber] = 0, [C].[PhoneNumber], NULL)) [NonMainNumber]
  37. FROM
  38. @Contact AS [C]
  39. WHERE
  40. [E].[Employee_Id] = [C].[Employee_Id]
  41. GROUP BY
  42. [C].[Employee_Id]) AS [COA] ;
  43.  
  44. Employee_Id Code MainPhoneNumber NonMainNumber
  45. 1 E1 1234567890 1234567893
  46. 2 E2 2234567891 2234567893
  47. 3 E3 3234567893 3234567892
  48.  
  49. Employee_Id Code MainPhoneType MainPhoneNumber NonMainPhoneType NonMainNumber
  50. 1 E1 M 1234567890 B 1234567893
  51. 2 E2 H 2234567891 M 2234567893
  52. 3 E3 B 3234567893 M 3234567892
  53.  
  54. select e.Employee_Id, e.Code,
  55. c.PhoneType as MainPhoneType, c.PhoneNumber as MainPhoneNumber,
  56. c1.PhoneType as NonMainPhoneType, c1.PhoneNumber as NonMainNumber
  57. from @Employee e outer apply
  58. (select top (1) c.PhoneType, c.PhoneNumber
  59. from @Contact c
  60. where c.Employee_Id = e.Employee_Id and
  61. c.IsMainNumber = 1
  62. order by c.phonetype
  63. ) c outer apply
  64. (select top (1) c1.PhoneType, c1.PhoneNumber
  65. from @Contact c1
  66. where c1.Employee_Id = e.Employee_Id and
  67. c1.IsMainNumber = 0
  68. order by c1.phonetype
  69. ) c1;
  70.  
  71. insert into #temp (Employee_Id, PhoneType, PhoneNumber, IsMainNumber)
  72. select Employee_Id, PhoneType, PhoneNumber, IsMainNumber
  73. from (select *, row_number() over (partition by Employee_Id, IsMainNumber order by PhoneType) as seq
  74. from @Contact
  75. ) c
  76. where seq = 1
  77.  
  78. select e.*, m.*
  79. from @Employee e cross apply
  80. (select max(case when t.IsMainNumber = 1 then t.PhoneType end) as MainPhoneType,
  81. max(case when t.IsMainNumber = 1 then t.PhoneNumber end) as MainPhoneNumber,
  82. max(case when t.IsMainNumber = 0 then t.PhoneType end) as NonMainPhoneType,
  83. max(case when t.IsMainNumber = 0 then t.PhoneNumber end) as NonMainNumber
  84. from #temp t
  85. where t.Employee_Id = e.Employee_Id
  86. ) m;
  87.  
  88. select x.Employee_Id
  89. , x.Code
  90. , MainPhoneType = max(case when x.RowNum = 1 then x.PhoneType end)
  91. , MainPhoneNumber = max(case when x.RowNum = 1 then x.PhoneNumber end)
  92. , NonMainPhoneType = max(case when x.RowNum = 2 then x.PhoneType end)
  93. , NonMainPhoneNumber = max(case when x.RowNum = 2 then x.PhoneNumber end)
  94. from
  95. (
  96. select e.Employee_Id
  97. , e.Code
  98. , c.PhoneType
  99. , c.PhoneNumber
  100. , RowNum = ROW_NUMBER() over(partition by e.Employee_Id order by c.IsMainNumber desc, c.PhoneType) --Not sure how you determine the non MainNumber when there are several to pick from
  101. from @Employee e
  102. join @Contact c on c.Employee_Id = e.Employee_Id
  103. ) x
  104. group by x.Employee_Id
  105. , x.Code
  106.  
  107. select e.Employee_Id, e.Code
  108. max(case when seqnum = 1 and c.PhoneType = 'M' then c.PhoneType end) as MainPhoneType
  109. max(case when seqnum = 1 and c.PhoneType = 'M' then x.PhoneNumber end) as MainPhoneNumber,
  110. max(case when seqnum = 1 and c.PhoneType <> 'M' then c.PhoneType end) as NonMainPhoneType
  111. max(case when seqnum = 1 and c.PhoneType <> 'M' then c.PhoneNumber end) as NonMainPhoneNumber
  112. from @Employee e join
  113. (select c.*,
  114. row_number() over (partition by c.Employee_Id
  115. (case when PhoneType = 'M' then 'M' end)
  116. order by c.PhoneNumber desc
  117. ) as seqnum
  118. from @Contact c
  119. ) c
  120. on c.Employee_Id = e.Employee_Id
  121. group by e.Employee_Id, e.Code;
Add Comment
Please, Sign In to add comment