Usuário com melhor resposta
Criação de relatório com soma progressiva

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
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
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 5 de junho de 2013 14:57
- Não Sugerido como Resposta Rafael R Santos quarta-feira, 5 de junho de 2013 18:57
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 23 de junho de 2016 16:02
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]
-
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.
-
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;
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 23 de junho de 2016 16:02
-
-
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'.
-
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
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 5 de junho de 2013 14:57
- Não Sugerido como Resposta Rafael R Santos quarta-feira, 5 de junho de 2013 18:57
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 23 de junho de 2016 16:02
-
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