none
Criação de relatório com soma progressiva RRS feed

  • Pergunta

  • Olá a todos.

    Estou montando uma query para um mostrar a quantidade de caixas realizadas, quantidade estimada por dia e total de caixas realizadas até aquela data.

    A coluna TESTE deveria fazer a soma igual a coluna TOTAL_CAIXA por dia ao invés de DESC_TIPO_PROC.

    QUERY

    SELECT 
    	DATA,
    	ID_TIPO_PROC,
    	DESC_TIPO_PROC,
    	ROW_NUMBER() OVER(PARTITION BY DESC_PROJETO, ID_TIPO_PROC ORDER BY DESC_PROJETO, ID_TIPO_PROC) AS ORDEM_PROCESSO,
    	DESC_PROJETO,
    	ISNULL(SUM(QTD_CAIXAS),0) AS CX_REALIZADA,
    		(SELECT SUM(QTD_CAIXAS) 
    						FROM STAGE_PROC_GED 
    						WHERE DESC_PROJETO = EXTERNO.DESC_PROJETO
    						AND ID_TIPO_PROC = EXTERNO.ID_TIPO_PROC 
    						AND DATA BETWEEN (SELECT MIN(DATA) FROM STAGE_PROC_GED 
    															WHERE DESC_PROJETO = EXTERNO.DESC_PROJETO 
    															AND ID_TIPO_PROC = EXTERNO.ID_TIPO_PROC) 
    																AND EXTERNO.DATA) AS TOTAL_CAIXA, 
    -------->   
       
    (SELECT 
    	 SUM(CAST(QTD_CAIXAS_PREV AS FLOAT) / dbo.DIA_UTIL(DATA_INI, DATA_FIM))
     FROM STAGE_PROC_GED_PREVISTO PRE INNER JOIN (SELECT
    	DATA AS AUX_DATA,
    	ID_TIPO_PROC AS AUX_ID_PROC,	
    	DESC_TIPO_PROC AS AUX_PROC,
    	DESC_PROJETO AS AUX_PROJETO,
    	ROW_NUMBER() OVER(PARTITION BY DESC_PROJETO, ID_TIPO_PROC ORDER BY DESC_PROJETO, ID_TIPO_PROC) AS ORDEM_PROCESSO
    FROM 
    	STAGE_PROC_GED EXTERNO
    WHERE
    	DESC_PROJETO = 'Semaninha'
    GROUP BY
    	DATA,
    	ID_TIPO_PROC,
    	DESC_TIPO_PROC,
    	DESC_PROJETO) AUXILIAR
    	ON(PRE.DESC_PROJETO = AUXILIAR.AUX_PROJETO AND PRE.ID_TIPO_PROC = AUXILIAR.AUX_ID_PROC)
     WHERE DESC_PROJETO = EXTERNO.DESC_PROJETO AND ID_TIPO_PROC = EXTERNO.ID_TIPO_PROC)  AS TESTE,   
    -------->   
    	(SELECT 
    		 SUM(CAST(QTD_CAIXAS_PREV AS FLOAT) / dbo.DIA_UTIL(DATA_INI, DATA_FIM))
       FROM STAGE_PROC_GED_PREVISTO
       WHERE DESC_PROJETO = EXTERNO.DESC_PROJETO AND ID_TIPO_PROC = EXTERNO.ID_TIPO_PROC)  AS CX_PREVISTA_DIA,
    	ISNULL(SUM(TOTAL_IMAGEM),0) AS IMG_REALIZADA,
    	(SELECT
    		 CASE 
    		   WHEN ID_TIPO_PROC = 4 THEN (TOTAL_IMAGEM_PREV / dbo.DIA_UTIL(DATA_INI, DATA_FIM))
    		   ELSE 0
    		 END
    	 FROM STAGE_PROC_GED_PREVISTO
       WHERE DESC_PROJETO = EXTERNO.DESC_PROJETO AND ID_TIPO_PROC = EXTERNO.ID_TIPO_PROC
    		 ) AS IMG_PREVISTA_DIA,
    	ISNULL((SELECT SUM(TOTAL_IMAGEM) 
    		FROM STAGE_PROC_GED 
    		WHERE DESC_PROJETO = EXTERNO.DESC_PROJETO
    		AND ID_TIPO_PROC = EXTERNO.ID_TIPO_PROC 
    		AND DATA BETWEEN (SELECT MIN(DATA) FROM STAGE_PROC_GED 
    											WHERE DESC_PROJETO = EXTERNO.DESC_PROJETO 
    											AND ID_TIPO_PROC = EXTERNO.ID_TIPO_PROC) 
    												AND EXTERNO.DATA),0) AS TOTAL_IMAGENS,
    	(SELECT
    		 CAST(DIARIAS_PREV AS FLOAT) / dbo.DIA_UTIL(DATA_INI, DATA_FIM)
    	 FROM STAGE_PROC_GED_PREVISTO
       WHERE DESC_PROJETO = EXTERNO.DESC_PROJETO AND ID_TIPO_PROC = EXTERNO.ID_TIPO_PROC) AS DIARIA_PREVISTA_DIA
    FROM 
    	STAGE_PROC_GED EXTERNO
    WHERE
    	DESC_PROJETO = 'Semaninha'
    GROUP BY
    	DATA,
    	ID_TIPO_PROC,
    	DESC_TIPO_PROC,
    	DESC_PROJETO
    ORDER BY
    	DESC_PROJETO,
    	ID_TIPO_PROC,
    	DATA

    Eu ia postar a imagem dos resultados, mas a Microsoft não deixou.

    Agradeço a ajuda de todos.

    Abraços

    quarta-feira, 29 de maio de 2013 21:10

Respostas

  • Rafael, bom dia.

    Fiz um exemplo rapidao aqui pra vc ver a logica pra fazer somatório da coluna valor, ve se ajuda:

    create table t1 (id int identity not null, valor numeric(8,2))
    go
    
    insert into t1 values (RAND()*100)
    go 100
    
    -- sql 2008
    ; with cte as (
    	select id, valor from t1
    )
    select t.id, c.valor,  sum(c.valor) as soma 
    from cte c
    inner join t1 t on c.id <= t.id
    group by t.id, c.valor
    order by t.id
    
    -- sql 2012
    select id, valor, sum(valor) over (order by id 
    				rows unbounded preceding) as soma
    from t1
    
    

    segunda-feira, 3 de junho de 2013 12:38

Todas as Respostas

  • Rafael,

    Em relação a imagens é possível sim fazer upload de arquivo, tem que verificar qual é a extensão compatível!!!

    No caso da sua dúvida eu particularmente não conseguir entender o que você esta tendo de problemas.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 31 de maio de 2013 01:07
  • Olá Junior, o meu problema e conseguir o efeito da coluna TOTAL_CAIXA em TESTE, pois em TOTAL_CAIXA é realizado uma soma de acordo com a data, mas em TESTE e feito de acordo com ID_TIPO_PROC.

    Acesse a imagem em https://lh4.googleusercontent.com/coyfe_6ETJDBaGVQ1N_Jof69rCNHtc3E_58ujpWFgkk=w623-h207-p-no

    https://plus.google.com/photos/115732703116636716075/albums/5569269552800347665/5883955469098772626?banner=pwa&pid=5883955469098772626&oid=115732703116636716075

    Obrigado pela ajuda e disposição em solucionar este problema.

    sexta-feira, 31 de maio de 2013 02:03
  • Rafael, bom dia.

    Qual versão do sql vc esta usando?

    se for no 2012 você pode usar como no exemplo abaixo e pode encontrar mais informações no link:

    http://msdn.microsoft.com/en-us/library/ms189461.aspx

    SELECT BusinessEntityID, TerritoryID 
        ,CONVERT(varchar(20),SalesYTD,1) AS  SalesYTD
        ,DATEPART(yy,ModifiedDate) AS SalesYear
        ,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID 
                                                 ORDER BY DATEPART(yy,ModifiedDate) 
                                                 ROWS UNBOUNDED PRECEDING),1) AS CumulativeTotal
    FROM Sales.SalesPerson
    WHERE TerritoryID IS NULL OR TerritoryID < 5;
    

    sexta-feira, 31 de maio de 2013 12:36
  • A versão utilizada é SQL SERVER 2008 R2
    sexta-feira, 31 de maio de 2013 13:16
  • Caro Douglas,

    como seria se estivesse em uma sub-consulta. No local da coluna Teste utilizei a seguinte query

    (SELECT 
    		 SUM(CAST(QTD_CAIXAS_PREV AS FLOAT) / dbo.DIA_UTIL(DATA_INI, DATA_FIM))
    		 OVER (PARTITION BY EXTERNO.ID_TIPO_PROC ORDER BY EXTERNO.DATA)
       FROM STAGE_PROC_GED_PREVISTO
       WHERE DESC_PROJETO = EXTERNO.DESC_PROJETO AND ID_TIPO_PROC = EXTERNO.ID_TIPO_PROC) AS TESTE2,

    Os seguintes erros foram levantados:

    Msg 102, Level 15, State 1, Line 20
    Incorrect syntax near 'order'.
    Msg 156, Level 15, State 1, Line 28
    Incorrect syntax near the keyword 'AS'.
    Msg 156, Level 15, State 1, Line 37
    Incorrect syntax near the keyword 'AS'.
    Msg 102, Level 15, State 1, Line 45
    Incorrect syntax near ','.
    Msg 156, Level 15, State 1, Line 49
    Incorrect syntax near the keyword 'AS'.

    segunda-feira, 3 de junho de 2013 12:08
  • Rafael, bom dia.

    Fiz um exemplo rapidao aqui pra vc ver a logica pra fazer somatório da coluna valor, ve se ajuda:

    create table t1 (id int identity not null, valor numeric(8,2))
    go
    
    insert into t1 values (RAND()*100)
    go 100
    
    -- sql 2008
    ; with cte as (
    	select id, valor from t1
    )
    select t.id, c.valor,  sum(c.valor) as soma 
    from cte c
    inner join t1 t on c.id <= t.id
    group by t.id, c.valor
    order by t.id
    
    -- sql 2012
    select id, valor, sum(valor) over (order by id 
    				rows unbounded preceding) as soma
    from t1
    
    

    segunda-feira, 3 de junho de 2013 12:38
  • Obrigado a todos pela ajuda, mas acabei mudando um pouco a forma de inserção e acabei criando uma stored procedure onde levo a query escrita acima para um tabela temporária e a partir da tabela temporária realizo uma query especificando esta tabela temporária na clausula from. No select desta query realizo um subselect onde a data tem que estar entre a menor data da tabela temporária com aqueles parâmetros e a data com a query externa.

    Se alguém animar de ver a query doida, é só falar que posto.

    Abraços e obrigado a todos que se empenharam em ajudar.


    Rafael R

    quarta-feira, 5 de junho de 2013 19:04