Friday, March 9, 2012

How to sum the time and place at the last registry

Hi,

I have the following problem... In my table I store calling registries...and when a call is transfered to another branch the last brach have to receive all the time...

Só I have the following table

Code Snippet

CREATE TABLE [BILHETES_PROCESSAR] (
[COD_CLIENT] [varchar] (50) COLLATE Latin1_General_CI_AS NOT NULL ,
[DATE_TIME] [datetime] NOT NULL ,
[NRTELEFONE] [varchar] (255) COLLATE Latin1_General_CI_AS NOT NULL ,
[BRANCH] [varchar] (255) COLLATE Latin1_General_CI_AS NULL ,
[TIPO] [varchar] (255) COLLATE Latin1_General_CI_AS NULL ,
[TIPO_ORIGINAL] [varchar] (255) COLLATE Latin1_General_CI_AS NULL ,-- Tells if is a originate call "2" or received a tranfer "6"
[TRONCO] [varchar] (255) COLLATE Latin1_General_CI_AS NULL , -- The port of the router through the call have been made
[TRANSF] [varchar] (50) COLLATE Latin1_General_CI_AS NULL ,--The branch that is going to receive this call
[ORIGEM_TRANSF] [varchar] (50) COLLATE Latin1_General_CI_AS NULL ,--The branch that sent the call

[VALOR_TEMPO] [money] NULL ,
[ID_TRANSF] [uniqueidentifier] NULL ,--ID for the branch that originated the call
[ID_REGISTRO] [uniqueidentifier] NOT NULL --ID of the registry
) ON [PRIMARY]
GO

For this table I can have the following data

Code Snippet

1002 2007-07-30 17:52:34.000 01191084426 236 2 2 9 210 NULL 15.0 C1AF0190-B1EB-4DEB-993A-D64D6C9F7CD4 C1AF0190-B1EB-4DEB-993A-D64D6C9F7CD4
1002 2007-07-30 17:53:17.000 01191084426 210 2 6 9 214 236 63.0 C1AF0190-B1EB-4DEB-993A-D64D6C9F7CD4 D680C38D-C217-461A-8207-9FC367FBB51C
1002 2007-07-30 17:54:30.000 01191084426 214 2 6 9 NULL 210 50.0 C1AF0190-B1EB-4DEB-993A-D64D6C9F7CD4 24B3073B-F45F-4E87-9796-55F37847473D

So I got this results running this query..

Code Snippet

UPDATE P SET P.TRANSF=P2.BRANCH,
P.ID_TRANSF=
CASE
WHEN P.TIPO_ORIGINAL = '2' THEN P.ID_REGISTRO
WHEN P2.ID_TRANSF IS NOT NULL THEN P2.ID_TRANSF
ELSE '1C4CCB4E-9229-4A6C-A6A4-B881A01EEACF'
END
FROM BILHETES_PROCESSAR P INNER JOIN BILHETES_PROCESSAR P2
ON
P.COD_CLIENTE=P2.COD_CLIENTE AND
P.NRTELEFONE=P2.NRTELEFONE AND
P.TRONCO=P2.TRONCO
WHERE
P2.DATE_TIME >= P.DATE_TIME
AND (
(P.TIPO_ORIGINAL IN (1, 5, 7) AND P2.TIPO_ORIGINAL IN (5, 7)) OR
(P.TIPO_ORIGINAL IN (2, 4, 6, 8) AND P2.TIPO_ORIGINAL IN (4, 6, 8))
)
AND P2.BRANCH <> P.BRANCH
AND P.TRANSF IS NULL

UPDATE P2 SET P2.ORIGEM_TRANSF=P.BRANCH, P2.ID_TRANSF=
CASE
WHEN P.ID_TRANSF IS NOT NULL THEN P.ID_TRANSF
ELSE P.ID_REGISTRO
END
FROM BILHETES_PROCESSAR P INNER JOIN BILHETES_PROCESSAR P2
ON
P.COD_CLIENTE=P2.COD_CLIENTE AND
P.NRTELEFONE=P2.NRTELEFONE AND
P.TRONCO=P2.TRONCO
WHERE
P2.DATE_TIME >= P.DATE_TIME
AND (
(P.TIPO_ORIGINAL IN (1, 5, 7) AND P2.TIPO_ORIGINAL IN (5, 7)) OR
(P.TIPO_ORIGINAL IN (2, 4, 6, 8) AND P2.TIPO_ORIGINAL IN (4, 6, 8))
)
AND P2.BRANCH <> P.BRANCH
AND P2.ORIGEM_TRANSF IS NULL

UPDATE P2 SET P2.ID_TRANSF=P.ID_TRANSF
FROM BILHETES_PROCESSAR P INNER JOIN BILHETES_PROCESSAR P2
ON
P.COD_CLIENTE=P2.COD_CLIENTE AND
P.NRTELEFONE=P2.NRTELEFONE AND
P.TRONCO=P2.TRONCO
WHERE
P2.DATE_TIME >= P.DATE_TIME
AND (
(P.TIPO_ORIGINAL IN (5, 7) AND P2.TIPO_ORIGINAL IN (5, 7)) OR
(P.TIPO_ORIGINAL IN (4, 6, 8) AND P2.TIPO_ORIGINAL IN (4, 6, 8))
)
AND P2.BRANCH <> P.BRANCH
AND P2.ID_TRANSF='1C4CCB4E-9229-4A6C-A6A4-B881A01EEACF'


This query has only one problem if the user has made a 4o transfer th2 two last registry will have wrong "transf" and "origem_transf" values... but this is not my big problem...

The big problem is that I need to sum all it "valor_tempo" put it on the last registry... that is the one with the code "24B3073B-F45F-4E87-9796-55F37847473D" and then set the "valor_tempo" to 0 to the other registry...

Did you get the ideia ?

Thanks

Hi,

I solved the problem ... But it's taking tooooooooooo much time...like 7 hours to run on all registries...is there a faster way to do that ?

Code Snippet

DECLARE @.REGS_TRANSF as UNIQUEIDENTIFIER
DECLARE @.REG_ATUALIZAR as UNIQUEIDENTIFIER
DECLARE @.VALOR_TEMPO_TOTAL AS MONEY
DECLARE CUR_REGTRANSF CURSOR FOR SELECT ID_TRANSF FROM BILHETES_PROCESSAR WHERE ID_TRANSF IS NOT NULL GROUP BY ID_TRANSF

OPEN CUR_REGTRANSF

FETCH NEXT FROM CUR_REGTRANSF INTO @.REGS_TRANSF
WHILE @.@.FETCH_STATUS = 0
BEGIN
SET @.REG_ATUALIZAR=(SELECT ID_REGISTRO FROM BILHETES_PROCESSAR WHERE ID_TRANSF=@.REGS_TRANSF AND TRANSFERIDO IS NULL)
SET @.VALOR_TEMPO_TOTAL=(SELECT SUM(VALOR_TEMPO) FROM BILHETES_PROCESSAR WHERE ID_REGISTRO <> @.REG_ATUALIZAR AND ID_TRANSF=@.REGS_TRANSF)
UPDATE BILHETES_PROCESSAR SET VALOR_TEMPO=VALOR_TEMPO+@.VALOR_TEMPO_TOTAL WHERE ID_REGISTRO=@.REG_ATUALIZAR
UPDATE BILHETES_PROCESSAR SET VALOR_TEMPO=0 WHERE ID_REGISTRO <> @.REG_ATUALIZAR
FETCH NEXT FROM CUR_REGTRANSF INTO @.REGS_TRANSF
END

CLOSE CUR_REGTRANSF
DEALLOCATE CUR_REGTRANSF

Here is the code that I used....some fields has diff names...cause we changed...

No comments:

Post a Comment