martes, 15 de abril de 2014

Calculate days off

COPY THIS INTO SQL SERVER

--TABLE


SET ANSI_NULLS ON

GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ETL_Days_Off](
[DayOffID] [int] IDENTITY(1,1) NOT NULL,
[DayOff] [date] NOT NULL,
 CONSTRAINT [PK_ETL_DAYS_OFF] PRIMARY KEY CLUSTERED 
(
[DayOffID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

--DATA


DayOffID DayOff

1 2014-04-17
3 2014-04-18

--FUNCTION


IF OBJECT_ID (N'dbo.NextAvailableDay', N'FN') IS NOT NULL

    DROP FUNCTION dbo.NextAvailableDay;
GO
CREATE FUNCTION dbo.NextAvailableDay (@Date datetime)
RETURNS DATETIME
WITH EXECUTE AS CALLER
AS
BEGIN
     
DECLARE @OK BIT = 0

WHILE (@OK = 0)

BEGIN

SELECT @Date = @Date + 1


IF ((SELECT COUNT(1) FROM ETL_Days_Off WHERE DayOff = @Date) = 0

AND (SELECT DATEPART(DW, @Date)) <> '6'  --SABADO
AND (SELECT DATEPART(DW, @Date)) <> '7') --DOMINGO
SELECT @OK = 1

END


     RETURN(DATEADD(HOUR,9,@Date));

END;
GO

--CALL

SET DATEFIRST 1;
SELECT dbo.NextAvailableDay(CONVERT(DATETIME,'04/16/2014',101)) AS 'ISO Week';

martes, 8 de abril de 2014

Divide full name in parts using SQL

--<< COPY THIS TEST TO YOUR QUERY EDITOR >>--

ALTER PROCEDURE ETL_PARSE_FULLNAME 

AS
BEGIN
-- ==========================================================================================
-- Author: Netro
-- Create date: 2014-03-26
-- Description:
-- Proceso de mantenimiento de datos importados por el ETL. --
-- Actualizacion de nombres desde fullname desglozando nombre, aparterno, amaterno 
-- ==========================================================================================

SET NOCOUNT ON;


--PASO PREVIO 1: GUARDAR DATO ORIGINAL

UPDATE TWCLIENTES_ATN SET NOMBREREP_CLI=NOMBRE_CLI WHERE APATERNO_CLI IS NULL AND AMATERNO_CLI IS NULL


    --PASO PREVIO 2: NOMBRE_APELLIDO_APELLIDO--PASO PREVIO 1: ELIMINAR ESPACIOS INICIO/FINAL Y CONVERTIR A MAYUSCULAS

UPDATE TWCLIENTES_ATN SET NOMBRE_CLI = LTRIM(RTRIM(UPPER(NOMBRE_CLI)))


--PASO PREVIO 3: UNION DE LOS MODIFICADORES: DE, DEL, LA, LAS, LOS, A, SAN, 


UPDATE TWCLIENTES_ATN SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' LA ', ' LA_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' LA ', UPPER(NOMBRE_CLI)) > 0 

UPDATE TWCLIENTES_ATN SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' LAS ', ' LAS_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' LAS ', UPPER(NOMBRE_CLI)) > 0 
UPDATE TWCLIENTES_ATN SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' SAN ', ' SAN_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' SAN ', UPPER(NOMBRE_CLI)) > 0 
UPDATE TWCLIENTES_ATN SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' LOS ', ' LOS_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' LOS ', UPPER(NOMBRE_CLI)) > 0 
UPDATE TWCLIENTES_ATN SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' A ', ' A_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' A ', UPPER(NOMBRE_CLI)) > 0 
UPDATE TWCLIENTES_ATN SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' DEL ', ' DEL_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' DEL ', UPPER(NOMBRE_CLI)) > 0 
UPDATE TWCLIENTES_ATN SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' DE ', ' DE_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' DE ', UPPER(NOMBRE_CLI)) > 0

UPDATE TWCLIENTES_VTA SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' LA ', ' LA_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' LA ', UPPER(NOMBRE_CLI)) > 0 

UPDATE TWCLIENTES_VTA SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' LAS ', ' LAS_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' LAS ', UPPER(NOMBRE_CLI)) > 0 
UPDATE TWCLIENTES_VTA SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' SAN ', ' SAN_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' SAN ', UPPER(NOMBRE_CLI)) > 0 
UPDATE TWCLIENTES_VTA SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' LOS ', ' LOS_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' LOS ', UPPER(NOMBRE_CLI)) > 0 
UPDATE TWCLIENTES_VTA SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' A ', ' A_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' A ', UPPER(NOMBRE_CLI)) > 0 
UPDATE TWCLIENTES_VTA SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' DEL ', ' DEL_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' DEL ', UPPER(NOMBRE_CLI)) > 0 
UPDATE TWCLIENTES_VTA SET NOMBRE_CLI = Replace(NOMBRE_CLI, ' DE ', ' DE_') WHERE APATERNO_CLI IS NULL AND CHARINDEX(' DE ', UPPER(NOMBRE_CLI)) > 0


--CASO 1: NOMBRE_APELLIDO


UPDATE  TWCLIENTES_ATN SET

NOMBRE_CLI = 
RTRIM(SUBSTRING(NOMBRE_CLI, 1,CHARINDEX(' ', NOMBRE_CLI))),
APATERNO_CLI = 
RTRIM(REVERSE(SUBSTRING(REVERSE(NOMBRE_CLI), 1,CHARINDEX(' ', REVERSE(NOMBRE_CLI)))))
WHERE APATERNO_CLI IS NULL
AND LEN(NOMBRE_CLI) - LEN(REPLACE(NOMBRE_CLI, ' ', '')) = 1

UPDATE  TWCLIENTES_VTA SET

NOMBRE_CLI = 
RTRIM(SUBSTRING(NOMBRE_CLI, 1,CHARINDEX(' ', NOMBRE_CLI))),
APATERNO_CLI = 
RTRIM(REVERSE(SUBSTRING(REVERSE(NOMBRE_CLI), 1,CHARINDEX(' ', REVERSE(NOMBRE_CLI)))))
WHERE APATERNO_CLI IS NULL
AND LEN(NOMBRE_CLI) - LEN(REPLACE(NOMBRE_CLI, ' ', '')) = 1


--CASO 2: NOMBRE_APELLIDO_APELLIDO O MAS

UPDATE  TWCLIENTES_ATN SET

NOMBRE_CLI = 
RTRIM(SUBSTRING(RTRIM(SUBSTRING(NOMBRE_CLI,1,LEN(NOMBRE_CLI)-CHARINDEX(' ', REVERSE(NOMBRE_CLI)))),1,
LEN(RTRIM(SUBSTRING(NOMBRE_CLI,1,LEN(NOMBRE_CLI)-CHARINDEX(' ', REVERSE(NOMBRE_CLI)))))-
CHARINDEX(' ',REVERSE(
RTRIM(SUBSTRING(NOMBRE_CLI,1,LEN(NOMBRE_CLI)-CHARINDEX(' ', REVERSE(NOMBRE_CLI))))
)))),
APATERNO_CLI =
REVERSE(SUBSTRING(REVERSE(
RTRIM(SUBSTRING(NOMBRE_CLI,1,LEN(NOMBRE_CLI)-CHARINDEX(' ', REVERSE(NOMBRE_CLI))))
), 1,(CHARINDEX(' ', REVERSE(
RTRIM(SUBSTRING(NOMBRE_CLI,1,LEN(NOMBRE_CLI)-CHARINDEX(' ', REVERSE(NOMBRE_CLI))))
)) - 1))),
AMATERNO_CLI =  
REVERSE(SUBSTRING(REVERSE(NOMBRE_CLI), 1,CHARINDEX(' ', REVERSE(NOMBRE_CLI)) - 1))
WHERE APATERNO_CLI IS NULL
AND LEN(NOMBRE_CLI) - LEN(REPLACE(NOMBRE_CLI, ' ', '')) > 1 

UPDATE  TWCLIENTES_VTA SET

NOMBRE_CLI = 
RTRIM(SUBSTRING(RTRIM(SUBSTRING(NOMBRE_CLI,1,LEN(NOMBRE_CLI)-CHARINDEX(' ', REVERSE(NOMBRE_CLI)))),1,
LEN(RTRIM(SUBSTRING(NOMBRE_CLI,1,LEN(NOMBRE_CLI)-CHARINDEX(' ', REVERSE(NOMBRE_CLI)))))-
CHARINDEX(' ',REVERSE(
RTRIM(SUBSTRING(NOMBRE_CLI,1,LEN(NOMBRE_CLI)-CHARINDEX(' ', REVERSE(NOMBRE_CLI))))
)))),
APATERNO_CLI =
REVERSE(SUBSTRING(REVERSE(
RTRIM(SUBSTRING(NOMBRE_CLI,1,LEN(NOMBRE_CLI)-CHARINDEX(' ', REVERSE(NOMBRE_CLI))))
), 1,(CHARINDEX(' ', REVERSE(
RTRIM(SUBSTRING(NOMBRE_CLI,1,LEN(NOMBRE_CLI)-CHARINDEX(' ', REVERSE(NOMBRE_CLI))))
)) - 1))),
AMATERNO_CLI =  
REVERSE(SUBSTRING(REVERSE(NOMBRE_CLI), 1,CHARINDEX(' ', REVERSE(NOMBRE_CLI)) - 1))
WHERE APATERNO_CLI IS NULL
AND LEN(NOMBRE_CLI) - LEN(REPLACE(NOMBRE_CLI, ' ', '')) > 1 


--PASO POSTERIOR: ELIMINAR GUIONES 

UPDATE TWCLIENTES_ATN SET

NOMBRE_CLI = REPLACE(NOMBRE_CLI,'_',' '),
APATERNO_CLI = REPLACE(APATERNO_CLI,'_',' '),
AMATERNO_CLI = REPLACE(AMATERNO_CLI,'_',' ')
WHERE CHARINDEX('_',NOMBRE_CLI)>0 
OR CHARINDEX('_',APATERNO_CLI)>0 
OR CHARINDEX('_',AMATERNO_CLI)>0  

UPDATE TWCLIENTES_VTA SET

NOMBRE_CLI = REPLACE(NOMBRE_CLI,'_',' '),
APATERNO_CLI = REPLACE(APATERNO_CLI,'_',' '),
AMATERNO_CLI = REPLACE(AMATERNO_CLI,'_',' ')
WHERE CHARINDEX('_',NOMBRE_CLI)>0 
OR CHARINDEX('_',APATERNO_CLI)>0 
OR CHARINDEX('_',AMATERNO_CLI)>0 

END

GO

Extract postal code 4 and 5 numeric values from the last part address in SQL

EXEC EXTRACT_CP 'PROL LUIS PONCE PRIN NO 12345   LA MORENA 17237 COYOACAN'
EXEC EXTRACT_CP 'PROL LUIS PONCE PRIN NO 1234   RINCONADA 7237 COYOACAN'
GO

ALTER PROCEDURE EXTRACT_CP

@str VARCHAR(MAX)
AS
BEGIN

DECLARE @tmp VARCHAR(MAX)

SELECT @tmp = @str

SELECT @tmp = 

REVERSE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
@tmp,'9','@'),'8','@'),'7','@'),'6','@'),'5','@'),'4','@'),'3','@'),'2','@'),'1','@'),'0','@'))

DECLARE @pos INT

IF (CHARINDEX('@@@@@', @tmp) = 0)

BEGIN
SELECT @pos = CHARINDEX('@@@@', @tmp)
SELECT @tmp = '0'
SELECT @tmp = @tmp + REVERSE(SUBSTRING(REVERSE(@str), @pos, 4))
END
ELSE
BEGIN
SELECT @pos = CHARINDEX('@@@@@', @tmp)
SELECT @tmp = REVERSE(SUBSTRING(REVERSE(@str), @pos, 5))
END

SELECT @tmp


END

GO