Number of insuree with Active insurance by Product/location/age range/gender/yearMonth
This request use a CROSS APPLY to sum the active policies per yearmonth, this approach use lot of compute, it shouldn’t be executed on a live server during business hours
Parameters:
RegionCode (can be null)
DistrictCode (can be null)
WardCode (can be null)
VillageCode (can be null)
startDate: date of the first YearMonth to be retreived
stopDate: date of the last YearMonth to be retreived
Dimensions:
Product code and Name
Location (Region, District, Ward, Village) code and name
Age range of 5 years until 80, then 1 group for 80+
Gender
Policy status
year month in the format YYYYMM
;WITH Locations as (
SELECT * FROM uvwLocations
WHERE VillageCode IS NOT NULL
AND (@RegionCode is null or @RegionCode='' or RegionCode = @RegionCode )
AND (@DistrictCode is null or @DistrictCode='' or DistrictCode = @DistrictCode)
AND (@WardCode is null or @WardCode='' or WardCode = @WardCode)
AND (@VillageCode is null or @VillageCode='' or VillageCode = @VillageCode)
),insuree AS
(
SELECT
tblLocations.LocationCode
,tblLocations.LocationName
,Ins.CHFID
,tblProduct.ProductCode
,tblProduct.ProductName
,tblPolicy.EnrollDate
,tblPolicy.StartDate
,tblPolicy.EffectiveDate
,tblPolicy.ExpiryDate
,tblPolicy.PolicyStatus
,tblPolicy.PolicyValue
,tblFamilies.FamilyType
,CASE
WHEN datediff(yy,Ins.DOB,tblPolicy.EnrollDate) > 80 THEN 16
ELSE datediff(yy,Ins.DOB,tblPolicy.EnrollDate)/5
END AS AgeGroup
,Ins.Gender
,head.CHFID AS HEADID
FROM tblInsureePolicy IP
INNER JOIN tblInsuree Ins
ON IP.InsureeID = Ins.InsureeID
INNER JOIN tblPolicy
ON IP.policyId = tblPolicy.policyId
INNER JOIN tblFamilies
ON tblPolicy.FamilyID= tblFamilies.FamilyID
INNER JOIN tblInsuree head
ON tblFamilies.InsureeID = head.InsureeID
INNER JOIN tblProduct
ON tblPolicy.ProdID = tblProduct.ProdID
LEFT JOIN tblLocations
ON tblFamilies.LocationId = tblLocations.LocationId
WHERE
Ins.CHFID <> '999999999'
and tblPolicy.ValidityTo IS NULL
AND (tblPolicy.StartDate <= @stopDate or tblPolicy.StartDate <= @stopDate)
AND (tblPolicy.ExpiryDate > @startDate)
AND (tblPolicy.EffectiveDate IS NOT NULL)
AND (tblLocations.LocationCode in (SELECT VillageCode from Locations) )
), MinMax as (
SELECT MIN(EffectiveDate) as Min
,MAX(ExpiryDate) as Max
,datediff(mm,@startDate,@stopDate) as nbWeek
FROM insuree
)
SELECT CONCAT( RIGHT(10000+DATEPART(yyyy, DATEADD(mm, x.number, @startDate)),4),RIGHT(100+DATEPART(mm,DATEADD(mm, x.number, @startDate)),2)) as YearMonth
, A.*
,p.ProductName
,l.VillageName
,l.VillageCode
,l.WardName
,l.WardCode
,l.DistrictName
,l.DistrictCode
,l.RegionName
,l.RegionCode
FROM master.dbo.spt_values x
CROSS APPLY
(
SELECT COUNT(DISTINCT CHFID) as nbInsuree
,ProductCode
,LocationCode
,PolicyStatus
,AgeGroup
,Gender
FROM insuree
WHERE insuree.EffectiveDate <= DATEADD(mm, x.number, @startDate)
And insuree.ExpiryDate >= DATEADD(mm, x.number, @startDate)
GROUP BY LocationCode
,ProductCode
,PolicyStatus
,AgeGroup
,Gender
) A
INNER JOIN tblProduct p
ON A.ProductCode = p.ProductCode
INNER JOIN Locations l
ON A.LocationCode = l.VillageCode
WHERE x.type = 'P' AND x.number <= DATEDIFF(mm, @startDate, @stopDate)
AND p.ValidityTo IS NULL
Did you encounter a problem or do you have a suggestion?
Please contact our Service Desk
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. https://creativecommons.org/licenses/by-sa/4.0/