Guest User

Untitled

a guest
Aug 20th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.81 KB | None | 0 0
  1. Stuck on this union / except
  2. transaction_id(pk) decision_id(pk) accepted_ind
  3. A 1 NULL
  4. A 2 <blank>
  5. A 4 Y
  6. B 1 <blank>
  7. B 2 Y
  8. C 1 Y
  9. D 1 N
  10. D 2 O
  11. D 3 Y
  12.  
  13. SELECT Transaction_id, Decision_ID, Accepted_id
  14. FROM MyTable t
  15. WHERE Accepted_ind = 'Y'
  16. OR (NOT EXISTS (SELECT 1 FROM MyTable t2
  17. WHERE Accepted_ind = 'Y'
  18. and t2.Transaction_id = t.transaction_id)
  19. AND Decision_id = 1)
  20.  
  21. DECLARE @t TABLE (
  22. transaction_id NCHAR(1),
  23. decision_id INT,
  24. accepted_ind NCHAR(1) NULL
  25. )
  26.  
  27. INSERT @t VALUES
  28. ( 'A' , 1 , NULL ),
  29. ( 'A' , 2 , '' ),
  30. ( 'A' , 4 , 'Y' ),
  31. ( 'B' , 1 , '' ),
  32. ( 'B' , 2 , 'N' ), -- change from your sample data
  33. ( 'C' , 1 , 'Y' ),
  34. ( 'D' , 1 , 'N' ),
  35. ( 'D' , 2 , 'O' ),
  36. ( 'D' , 3 , 'Y' )
  37.  
  38. SELECT transaction_id, decision_id, accepted_ind FROM (
  39. SELECT transaction_id, decision_id, accepted_ind,
  40. ROW_NUMBER() OVER (
  41. PARTITION BY transaction_id
  42. ORDER BY
  43. CASE
  44. WHEN accepted_ind = 'Y' THEN 1
  45. WHEN decision_id = 1 THEN 2
  46. ELSE 3
  47. END
  48. ) rn
  49. FROM @t
  50. ) Raw
  51. WHERE rn = 1
  52.  
  53. transaction_id decision_id accepted_ind
  54. -------------- ----------- ------------
  55. A 4 Y
  56. B 1
  57. C 1 Y
  58. D 3 Y
  59.  
  60. SELECT CASE
  61. WHEN accepteddecision.transaction_id IS NOT NULL THEN
  62. accepteddecision.transaction_id
  63. ELSE firstdecision.transaction_id
  64. END AS transaction_id,
  65. CASE
  66. WHEN accepteddecision.decision_id IS NOT NULL THEN
  67. accepteddecision.decision_id
  68. ELSE firstdecision.decision_id
  69. END AS decision_id,
  70. CASE
  71. WHEN accepteddecision.accepted_ind IS NOT NULL THEN
  72. accepteddecision.accepted_ind
  73. ELSE firstdecision.accepted_ind
  74. END AS accepted_ind
  75. FROM decision
  76. LEFT OUTER JOIN (SELECT *
  77. FROM decision AS accepteddecision
  78. WHERE accepteddecision.accepted_ind = 'Y') AS
  79. accepteddecision
  80. ON accepteddecision.transaction_id = decision.transaction_id
  81. LEFT OUTER JOIN (SELECT *
  82. FROM decision AS firstdecision
  83. WHERE firstdecision.decision_id = 1) AS firstdecision
  84. ON firstdecision.transaction_id = decision.transaction_id
  85. GROUP BY accepteddecision.transaction_id,
  86. firstdecision.transaction_id,
  87. accepteddecision.decision_id,
  88. firstdecision.decision_id,
  89. accepteddecision.accepted_ind,
  90. firstdecision.accepted_ind
  91.  
  92. WITH T AS (SELECT * FROM (
  93. VALUES ('A', 1, NULL),
  94. ('A', 2, ''),
  95. ('A', 4, 'Y'),
  96. ('B', 1, ''),
  97. ('B', 2, 'Y'),
  98. ('C', 1, 'Y'),
  99. ('D', 1, 'N'),
  100. ('D', 2, 'O'),
  101. ('D', 3, 'Y'),
  102. ('E', 2, 'O'), -- smaple data extended
  103. ('E', 1, 'N') -- smaple data extended
  104. ) AS T (transaction_id, decision_id, accepted_ind)
  105. )
  106. SELECT *
  107. FROM T
  108. WHERE accepted_ind = 'Y'
  109. UNION
  110. SELECT T.*
  111. FROM (
  112. SELECT transaction_id
  113. FROM T
  114. WHERE decision_id = 1
  115. EXCEPT
  116. SELECT transaction_id
  117. FROM T
  118. WHERE accepted_ind = 'Y'
  119. ) D
  120. JOIN T
  121. ON T.transaction_id = D.transaction_id
  122. AND T.decision_id = 1;
Add Comment
Please, Sign In to add comment