Home / T-SQL / Postcoderange opsplitsen naar losse records

Postcoderange opsplitsen naar losse records

Een requirement kan zijn om marktbewerking binnen Nederland op de kaart te visualiseren. Men deelt de postcodegebieden van Nederland in op basis van regio. Een regio kan weer bestaat uit ranges met postcodes. Het kan ook zo zijn dat men een bepaalde locatie koppelt aan een postcoderange of een salespersoon die gebied 1234 t/m 4567 moet bewerken.

Omdat de brondata voor deze requirement is opgeslagen als range was het noodzakelijk om de postcoderange te splitsen naar losse regels.

De brondata ziet er als volgt uit:

Vestiging- PostcodeStart – PostcodeEind

1 – 2700 – 2750
2- 2751 – 2800…………etc

Ik moest het resultaat opsplitsen zodat ik voor iedere postcode4 een unieke rij zou krijgen. Met deze data kan ik vervolgens leuke dingen doen in bijvoorbeeld Microsoft Excel met de Maps functie.

1 – 2700
1 – 2701
1 – 2702
….etc

Oplossing in SQL:

CREATE FUNCTION [dbo].[fnDSA2ISA_PostcodeBranch]()
RETURNS @MyResult TABLE 
 (PostcodeBranchCode VARCHAR(16),
 Postcode INT,
 BranchCode VARCHAR(16),
 MetaCreatieDatum DATETIME
 )
AS
BEGIN
 
DECLARE @TEMP_PostcodeBranch TABLE(
 BranchCode VARCHAR(16),
 PostcodeStart INT,
 PostcodeEind INT);
 
WITH BS
AS(
SELECT ROS.KostenPlaatsCode AS BranchCode
 , PostalCodeStart AS PostcodeStart
 , PostCodeEnd AS PostcodeEind
FROM SourceTable
 
)
 
INSERT INTO @TEMP_PostcodeBranch (BranchCode, PostcodeStart, PostcodeEind) 
SELECT * FROM BS;
 
WITH Tens (N) AS (SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
 SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1),
 Hundreds(N) AS (SELECT 1 FROM Tens t1, Tens t2),
 Millions(N) AS (SELECT 1 FROM Hundreds t1, Hundreds t2),
 Tally (N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM Millions)
 
INSERT @MyResult
SELECT DISTINCT
 CAST(t1.BranchCode + '_' + CAST(t2.n AS VARCHAR(6)) AS VARCHAR(16)) AS PostcodeBranchCode,
 t2.N AS Postcode,
 t1.BranchCode,
 GETDATE() AS MetaCreatieDatum
FROM @TEMP_PostcodeBranch t1
JOIN Tally t2 ON t2.N BETWEEN t1.PostcodeStart AND t1.PostcodeEind;
RETURN;
 
END

Check Also

Book Review: Unlocking the Power of DAX: A Deep Dive into Marco Russo’s Definitive Guide

The Definitive Guide to DAX: Business intelligence for Microsoft Power BI, SQL Server Analysis Services, …

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *