Valor Aculativo

22/08/2012

0

Boa noite,

Tenho uma query que me traz a quantidade, gostaria de ter uma coluna com o acumulativo da quantidade.
Como faço esse acumulativo?

DECLARE
	  @MES AS INT = 8
	, @ANO AS INT = 2012
	, @ID_SEQ_OPERACAO AS INT = 1
	, @FL_STATUS_OCORRENCIA AS CHAR(1) = 'S'

SELECT  MOTIVO.IDMOTIVO,
	MOTIVO.NOMMOTIVO,
	COUNT(*)         	AS TOTAL_OCORRENCIAS
FROM	OCORRENCIA			(NOLOCK) AS OCORRENCIA
		INNER JOIN MOTIVO	(NOLOCK) AS MOTIVO ON OCORRENCIA.IDMOTIVO = MOTIVO.IDMOTIVO
WHERE	DATEPART(m, OCORRENCIA.DTINCLUSAO)		= @MES	AND
		DATEPART(yyyy,OCORRENCIA.DTINCLUSAO)	= @ANO	
		(OCORRENCIA.FL_OCORRENCIA = @FLOCORRENCIA OR @FLOCORRENCIA IS NULL)
GROUP BY MOTIVO.IDMOTIVO, 
	 MOTIVO.NOMMOTIVO



Resultado

IDMOTIVO NOMMOTIVO TOTAL_OCORRENCIAS
3 Reserva 5
8 Banco de Horas 4
9 Previdência 1
51 Reclamação 1

Resultado Pretendido

IDMOTIVO NOMMOTIVO TOTAL_OCORRENCIAS OCORRENCIA_ACUMULADA
3 Reserva 5 5
8 Banco de Horas 4 9
9 Previdência 1 10
51 Reclamação 1 11
Responder

Posts

23/08/2012

Alex Lekao

Ola Maxuel, bom dia!!!

Nao sei se seria a melhor opcao, mas voce podera usar uma subselect, basicamente igual a que vc estaria usando com apenas o count e uma igualdade entre as duas no where.

Acho que daria certo.

Abraco.

Alex
Responder

23/08/2012

Max

Valeu,
Já é um caminho a seguir.
Responder

23/08/2012

Eduardo Gonçalves

Talvez isso aqui funcione. Ao invés de um subselect, coloquei uma tabela virtual X (montada a partir de um select) no FROM e fiz o inner join dela com MOTIVO. Se der errado, tire a palavra "AS".

SELECT MOTIVO.IDMOTIVO,
MOTIVO.NOMMOTIVO,
COUNT(*) AS TOTAL_OCORRENCIAS, X.TOTAL_GERAL
FROM OCORRENCIA (NOLOCK) AS OCORRENCIA
INNER JOIN MOTIVO (NOLOCK) AS MOTIVO ON OCORRENCIA.IDMOTIVO = MOTIVO.IDMOTIVO
INNER JOIN (SELECT IDMOTIVO, COUNT(*) FROM MOTIVO GROUP BY IDMOTIVO) AS X ON (MOTIVO.IDMOTIVO = X.IDMOTIVO)
WHERE DATEPART(m, OCORRENCIA.DTINCLUSAO) = @MES AND
DATEPART(yyyy,OCORRENCIA.DTINCLUSAO) = @ANO
(OCORRENCIA.FL_OCORRENCIA = @FLOCORRENCIA OR @FLOCORRENCIA IS NULL)
GROUP BY MOTIVO.IDMOTIVO,
MOTIVO.NOMMOTIVO
Responder

23/08/2012

Max

Eduardo,
Não sei se era isso que você mencionou, mas consegui fazer assim. Mas acho que te muita repetição de código.
Tem alguma sugestão para customizar esse select?

INSERT INTO @TEMP_TOT_OCORRENCIA SELECT MOTIVO.ID_SEQ_MOTIVO,
COUNT(*) AS NM_TOTAL_OCORRENCIAS
FROM OCORRENCIA (NOLOCK) AS OCORRENCIA
INNER JOIN TB_SGA_MOTIVO (NOLOCK) AS MOTIVO ON OCORRENCIA.ID_SEQ_MOTIVO = MOTIVO.ID_SEQ_MOTIVO
WHERE DATEPART(m, OCORRENCIA.DT_INCLUSAO) = @MES AND
DATEPART(yyyy,OCORRENCIA.DT_INCLUSAO) = @ANO AND
OCORRENCIA.ID_SEQ_OPERACAO = @ID_SEQ_OPERACAO AND
(OCORRENCIA.FL_STATUS_OCORRENCIA = @FL_STATUS_OCORRENCIA OR @FL_STATUS_OCORRENCIA IS NULL)
GROUP BY MOTIVO.ID_SEQ_MOTIVO

INSERT INTO @TEMP_VLR_ACUMULATIVO SELECT COD, (SELECT sum (X.valor) FROM @TEMP_TOT_OCORRENCIA X WHERE x.cod <= Y.cod) FROM @TEMP_TOT_OCORRENCIA Y


SELECT MOTIVO.ID_SEQ_MOTIVO,
MOTIVO.ST_NOM_MOTIVO,
COUNT(*) AS NM_TOTAL_OCORRENCIAS,
TEMP.VALOR AS NM_TOTAL_OCORRENCIAS_ACUMULADO,
SUM(CASE WHEN OCORRENCIA.FL_SLA_ATENDIDA = 'N' THEN 1 ELSE 0 END) AS NM_QTDE_ATRASADAS,
SUM(CASE WHEN OCORRENCIA.FL_FCR = 'S' THEN 1 ELSE 0 END) AS NM_QTDE_FCR,
AVG(DATEDIFF(S,OCORRENCIA.DT_INCLUSAO, OCORRENCIA.DT_FINALIZACAO)) AS NM_TMR_SEG
FROM TB_SGA_OCORRENCIA (NOLOCK) AS OCORRENCIA
INNER JOIN TB_SGA_MOTIVO (NOLOCK) AS MOTIVO ON OCORRENCIA.ID_SEQ_MOTIVO = MOTIVO.ID_SEQ_MOTIVO
INNER JOIN @TEMP_VLR_ACUMULATIVO AS TEMP ON MOTIVO.ID_SEQ_MOTIVO = TEMP.COD
WHERE DATEPART(m, OCORRENCIA.DT_INCLUSAO) = @MES AND
DATEPART(yyyy,OCORRENCIA.DT_INCLUSAO) = @ANO AND
OCORRENCIA.ID_SEQ_OPERACAO = @ID_SEQ_OPERACAO AND
(OCORRENCIA.FL_STATUS_OCORRENCIA = @FL_STATUS_OCORRENCIA OR @FL_STATUS_OCORRENCIA IS NULL)
GROUP BY MOTIVO.ID_SEQ_MOTIVO,
MOTIVO.ST_NOM_MOTIVO,
TEMP.VALOR
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar