Advertisement
Bluejay222

Query uses CTEs, Temp tables, subqueries, UNION,

Sep 23rd, 2024 (edited)
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.90 KB | None | 0 0
  1. --Because the age bands may be different depending on benefit codes, and because we need to insert zero values where appropriate,
  2. --this query is largely CTEs to organize everything up front, crossjoins to get the zero rows, and a final UNIONed query to put it together
  3.  
  4. -- Create tables to store the benefit codes and their groupings
  5.  
  6. CREATE TABLE #BENEFIT_CODES_1 (
  7. BENEFIT_CODE VARCHAR(2),
  8. GROUPINGS VARCHAR(11)
  9. );
  10.  
  11. -- Skookum benefit codes: removed va, vb, vc, vd, LW, LY, LZ, lF--these are not age rated
  12. INSERT INTO #BENEFIT_CODES_1 (BENEFIT_CODE, GROUPINGS)
  13. VALUES
  14. ('1v', '1v 5v ve vg'), ('5v', '1v 5v ve vg'), ('ve', '1v 5v ve vg'), ('vg', '1v 5v ve vg'),
  15. ('3v', '3v 4v vf vh'), ('4v', '3v 4v vf vh'), ('vf', '3v 4v vf vh'), ('vh', '3v 4v vf vh'),
  16. ('2v', '2v 6v vp vs'), ('6v', '2v 6v vp vs'), ('vp', '2v 6v vp vs'), ('vs', '2v 6v vp vs');
  17.  
  18. -- Create a table for age bands for "v codes"
  19. CREATE TABLE #AGE_BANDS_1 (
  20. AGE_GROUP VARCHAR(5),
  21. AGE_ORDER INT
  22. );
  23.  
  24. INSERT INTO #AGE_BANDS_1 (AGE_GROUP, AGE_ORDER)
  25. VALUES
  26. ('00-19', 1), ('20-24', 2), ('25-29', 3), ('30-34', 4),
  27. ('35-39', 5), ('40-44', 6), ('45-49', 7), ('50-54', 8),
  28. ('55-59', 9), ('60-64', 10), ('65-69', 11), ('70-74', 12),
  29. ('75-79', 13), ('80-84', 14), ('85-99', 15);
  30.  
  31. CREATE TABLE #BENEFIT_CODES_2 (
  32. BENEFIT_CODE VARCHAR(2),
  33. GROUPINGS VARCHAR(11)
  34. );
  35.  
  36. INSERT INTO #BENEFIT_CODES_2 (BENEFIT_CODE, GROUPINGS)
  37. VALUES
  38. ('dh', 'dh'),
  39. ('dg', 'dg'),
  40. ('dk', 'dk dm'), ('dm', 'dk dm');
  41.  
  42. -- Create a table for age bands for "d codes"
  43. CREATE TABLE #AGE_BANDS_2 (
  44. AGE_GROUP VARCHAR(5),
  45. AGE_ORDER INT
  46. );
  47.  
  48. INSERT INTO #AGE_BANDS_2 (AGE_GROUP, AGE_ORDER)
  49. VALUES
  50. ('00-24', 1), ('25-29', 2), ('30-34', 3),
  51. ('35-39', 4), ('40-44', 5), ('45-49', 6), ('50-54', 7),
  52. ('55-59', 8), ('60-64', 9), ('65-69', 10), ('70-99', 11);
  53.  
  54. -- Declare variables
  55. DECLARE @EFFECTIVE_YYYYMMDD DATE = '2024-07-01';
  56. DECLARE @AGE_AS_OF_YYYYMMDD DATE = DATEFROMPARTS(YEAR(@EFFECTIVE_YYYYMMDD), 1, 1);
  57.  
  58. -- Main query to calculate volume and premium by age group and benefit group
  59. WITH
  60. CTE_1 AS (
  61. SELECT
  62. bc.GROUPINGS AS BENEFITS,
  63. CASE
  64. WHEN ibe.BENEFIT_CODE = 'vs'
  65. THEN
  66. ISNULL(DATEDIFF(YEAR, i.SPOUSE_BIRTH_YYYYMMDD, @AGE_AS_OF_YYYYMMDD)
  67. ,DATEDIFF(YEAR, i.BIRTH_YYYYMMDD, @AGE_AS_OF_YYYYMMDD))
  68. ELSE DATEDIFF(YEAR, i.BIRTH_YYYYMMDD, @AGE_AS_OF_YYYYMMDD)
  69. END AS AGE,
  70. ibe.VOLUME,
  71. ibe.AMT as AMOUNT
  72. FROM INDFIL_FILE i
  73. JOIN IBEFIL_FILE ibe ON i.CASE_NUM = ibe.CASE_NUM AND i.CERT_NUM = ibe.CERT_NUM
  74. JOIN #BENEFIT_CODES_1 bc ON ibe.BENEFIT_CODE COLLATE SQL_Latin1_General_CP1_CS_AS = bc.BENEFIT_CODE COLLATE SQL_Latin1_General_CP1_CS_AS
  75. WHERE
  76. i.CASE_NUM = '46185'
  77. AND i.EFF_YYYYMMDD <= @EFFECTIVE_YYYYMMDD
  78. AND (i.TERM_YYYYMMDD > @EFFECTIVE_YYYYMMDD OR i.TERM_YYYYMMDD IS NULL)
  79. AND (COALESCE(ibe.TERM_YYYYMMDD,'') = '' OR ibe.TERM_YYYYMMDD > @EFFECTIVE_YYYYMMDD)
  80. AND i.CERT_NUM NOT in ('4773','1020','2325')
  81. AND i.DIV_NUM not in (SELECT [DIV_NUM]
  82. FROM [FBC].[dbo].[CASFIL_FILE]
  83. WHERE TERM_YYYYMMDD IS NOT NULL
  84. AND TERM_YYYYMMDD < @EFFECTIVE_YYYYMMDD
  85. AND CASE_NUM = '46185')
  86. ),
  87. GROUPED_DATA_1 AS (
  88. SELECT
  89. BENEFITS,
  90. CASE
  91. WHEN AGE < 20 THEN '00-19'
  92. WHEN AGE < 25 THEN '20-24'
  93. WHEN AGE < 30 THEN '25-29'
  94. WHEN AGE < 35 THEN '30-34'
  95. WHEN AGE < 40 THEN '35-39'
  96. WHEN AGE < 45 THEN '40-44'
  97. WHEN AGE < 50 THEN '45-49'
  98. WHEN AGE < 55 THEN '50-54'
  99. WHEN AGE < 60 THEN '55-59'
  100. WHEN AGE < 65 THEN '60-64'
  101. WHEN AGE < 70 THEN '65-69'
  102. WHEN AGE < 75 THEN '70-74'
  103. WHEN AGE < 80 THEN '75-79'
  104. WHEN AGE < 85 THEN '80-84'
  105. ELSE '85-99'
  106. END AS AGE_GROUP,
  107. COUNT(*) AS LIVES,
  108. SUM(CAST(VOLUME AS DECIMAL(18,2))) AS VOLUME,
  109. SUM(CAST(AMOUNT AS DECIMAL(18,2))) AS PREMIUM
  110. FROM CTE_1
  111. GROUP BY
  112. BENEFITS,
  113. CASE
  114. WHEN AGE < 20 THEN '00-19'
  115. WHEN AGE < 25 THEN '20-24'
  116. WHEN AGE < 30 THEN '25-29'
  117. WHEN AGE < 35 THEN '30-34'
  118. WHEN AGE < 40 THEN '35-39'
  119. WHEN AGE < 45 THEN '40-44'
  120. WHEN AGE < 50 THEN '45-49'
  121. WHEN AGE < 55 THEN '50-54'
  122. WHEN AGE < 60 THEN '55-59'
  123. WHEN AGE < 65 THEN '60-64'
  124. WHEN AGE < 70 THEN '65-69'
  125. WHEN AGE < 75 THEN '70-74'
  126. WHEN AGE < 80 THEN '75-79'
  127. WHEN AGE < 85 THEN '80-84'
  128. ELSE '85-99'
  129. END
  130. ),
  131. CTE_2 AS (
  132. SELECT
  133. bc.GROUPINGS AS BENEFITS,
  134. DATEDIFF(YEAR, i.BIRTH_YYYYMMDD, @AGE_AS_OF_YYYYMMDD) AS AGE,
  135. ibe.VOLUME,
  136. ibe.AMT as AMOUNT
  137. FROM INDFIL_FILE i
  138. JOIN IBEFIL_FILE ibe ON i.CASE_NUM = ibe.CASE_NUM AND i.CERT_NUM = ibe.CERT_NUM
  139. JOIN #BENEFIT_CODES_2 bc ON ibe.BENEFIT_CODE COLLATE SQL_Latin1_General_CP1_CS_AS = bc.BENEFIT_CODE COLLATE SQL_Latin1_General_CP1_CS_AS
  140. WHERE
  141. i.CASE_NUM = '46185'
  142. AND i.EFF_YYYYMMDD <= @EFFECTIVE_YYYYMMDD
  143. AND (i.TERM_YYYYMMDD >= @EFFECTIVE_YYYYMMDD OR i.TERM_YYYYMMDD IS NULL)
  144. AND (COALESCE(ibe.TERM_YYYYMMDD,'') = '' OR ibe.TERM_YYYYMMDD > @EFFECTIVE_YYYYMMDD)
  145. AND i.CERT_NUM NOT in ('4773','1020','2325')
  146. AND i.DIV_NUM not in (SELECT [DIV_NUM]
  147. FROM [FBC].[dbo].[CASFIL_FILE]
  148. WHERE TERM_YYYYMMDD IS NOT NULL
  149. AND TERM_YYYYMMDD < @EFFECTIVE_YYYYMMDD
  150. AND CASE_NUM = '46185')
  151. ),
  152. GROUPED_DATA_2 AS (
  153. SELECT
  154. BENEFITS,
  155. CASE
  156. WHEN AGE < 25 THEN '00-24'
  157. WHEN AGE < 30 THEN '25-29'
  158. WHEN AGE < 35 THEN '30-34'
  159. WHEN AGE < 40 THEN '35-39'
  160. WHEN AGE < 45 THEN '40-44'
  161. WHEN AGE < 50 THEN '45-49'
  162. WHEN AGE < 55 THEN '50-54'
  163. WHEN AGE < 60 THEN '55-59'
  164. WHEN AGE < 65 THEN '60-64'
  165. WHEN AGE < 70 THEN '65-69'
  166. ELSE '70-99'
  167. END AS AGE_GROUP,
  168. COUNT(*) AS LIVES,
  169. SUM(CAST(VOLUME AS DECIMAL(18,2))) AS VOLUME,
  170. SUM(CAST(AMOUNT AS DECIMAL(18,2))) AS PREMIUM
  171. FROM CTE_2
  172. GROUP BY
  173. BENEFITS,
  174. CASE
  175. WHEN AGE < 25 THEN '00-24'
  176. WHEN AGE < 30 THEN '25-29'
  177. WHEN AGE < 35 THEN '30-34'
  178. WHEN AGE < 40 THEN '35-39'
  179. WHEN AGE < 45 THEN '40-44'
  180. WHEN AGE < 50 THEN '45-49'
  181. WHEN AGE < 55 THEN '50-54'
  182. WHEN AGE < 60 THEN '55-59'
  183. WHEN AGE < 65 THEN '60-64'
  184. WHEN AGE < 70 THEN '65-69'
  185. ELSE '70-99'
  186. END
  187. ),
  188. ALL_COMBINATIONS_1 AS (
  189. SELECT bc.GROUPINGS AS BENEFITS, ab.AGE_GROUP, ab.AGE_ORDER
  190. FROM (SELECT DISTINCT GROUPINGS FROM #BENEFIT_CODES_1) bc
  191. CROSS JOIN #AGE_BANDS_1 ab
  192. ),
  193. ALL_COMBINATIONS_2 AS (
  194. SELECT bc.GROUPINGS AS BENEFITS, ab.AGE_GROUP, ab.AGE_ORDER
  195. FROM (SELECT DISTINCT GROUPINGS FROM #BENEFIT_CODES_2) bc
  196. CROSS JOIN #AGE_BANDS_2 ab
  197. )
  198.  
  199. -- Final select with zero-value rows, separated by benefit code groups
  200. SELECT
  201. ac.BENEFITS,
  202. ac.AGE_GROUP,
  203. COALESCE(gd.LIVES, 0) AS LIVES,
  204. COALESCE(gd.VOLUME, 0) AS VOLUME,
  205. COALESCE(gd.PREMIUM, 0) AS PREMIUM,
  206. ac.AGE_ORDER
  207. FROM ALL_COMBINATIONS_1 ac
  208. LEFT JOIN GROUPED_DATA_1 gd ON ac.BENEFITS = gd.BENEFITS AND ac.AGE_GROUP = gd.AGE_GROUP
  209.  
  210. UNION ALL
  211.  
  212. SELECT
  213. ac.BENEFITS,
  214. ac.AGE_GROUP,
  215. COALESCE(gd.LIVES, 0) AS LIVES,
  216. COALESCE(gd.VOLUME, 0) AS VOLUME,
  217. COALESCE(gd.PREMIUM, 0) AS PREMIUM,
  218. ac.AGE_ORDER
  219. FROM ALL_COMBINATIONS_2 ac
  220. LEFT JOIN GROUPED_DATA_2 gd ON ac.BENEFITS = gd.BENEFITS AND ac.AGE_GROUP = gd.AGE_GROUP
  221.  
  222. ORDER BY BENEFITS, AGE_ORDER;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement