Array
(
)

Valor Aculativo

Max
|
MVP
    22 ago 2012

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?
#Código

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

Alex Lekao
   - 23 ago 2012

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

Max
|
MVP
    23 ago 2012

Valeu,
Já é um caminho a seguir.

Eduardo Gonçalves
   - 23 ago 2012

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".

#Código

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

Max
|
MVP
    23 ago 2012

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