Ajuda em SQL para relatório
Pessoal preciso gerar um relatório em Report Builder e não estou
conseguindo
montar a Query de forma Correta, quanto ao Report Builder sei utilizar sem
problemas, O Lay-Out do Relatório deve ser o seguinte
[b:dbafead656]Departamento[/b:dbafead656] | [b:dbafead656]VL. Acumulado [/b:dbafead656]| [b:dbafead656]VL. Deste Caixa [/b:dbafead656]|
[b:dbafead656]VL. Acumulado Mês [/b:dbafead656]|
RH | 1500,00 | 150,00 |
250,00 |
Prod | 1800,00 | 200,00 |
300,00 |
[b:dbafead656]Departamento[/b:dbafead656] = Registro da Tabela Departamento
[b:dbafead656]VL. Acumulado[/b:dbafead656] = Todos os registros da Tabela MovimentoCaixaItem
Anteriores ao mes de Abril de 2005
O meu problema esta porque eu não posso apenas dar um Sum Agrupando por
departamento, eu preciso dar um Sum mas passando cada departamento que esta
na tabela departamento como parametro, ou seja preciso criar uma Linha para
cada registro que existe na tabela Departamento mesmo que o valor seja 0
A estrutura é a seguinte:
Tabela Departamento
Li_IDDepartamento
Str_NomeDepartamento
Tabela MovimentoCaixa (Master)
Li_IDMovimentoCaixa
DT_DataCaixa
Tabela MovimentoCaixaItem (Detalhe)
Li_IDMovimentoCaixa
Li_IDDepartamento
DBL_ValorLancamento
Acho que consegui explicar
conseguindo
montar a Query de forma Correta, quanto ao Report Builder sei utilizar sem
problemas, O Lay-Out do Relatório deve ser o seguinte
[b:dbafead656]Departamento[/b:dbafead656] | [b:dbafead656]VL. Acumulado [/b:dbafead656]| [b:dbafead656]VL. Deste Caixa [/b:dbafead656]|
[b:dbafead656]VL. Acumulado Mês [/b:dbafead656]|
RH | 1500,00 | 150,00 |
250,00 |
Prod | 1800,00 | 200,00 |
300,00 |
[b:dbafead656]Departamento[/b:dbafead656] = Registro da Tabela Departamento
[b:dbafead656]VL. Acumulado[/b:dbafead656] = Todos os registros da Tabela MovimentoCaixaItem
Anteriores ao mes de Abril de 2005
O meu problema esta porque eu não posso apenas dar um Sum Agrupando por
departamento, eu preciso dar um Sum mas passando cada departamento que esta
na tabela departamento como parametro, ou seja preciso criar uma Linha para
cada registro que existe na tabela Departamento mesmo que o valor seja 0
A estrutura é a seguinte:
Tabela Departamento
Li_IDDepartamento
Str_NomeDepartamento
Tabela MovimentoCaixa (Master)
Li_IDMovimentoCaixa
DT_DataCaixa
Tabela MovimentoCaixaItem (Detalhe)
Li_IDMovimentoCaixa
Li_IDDepartamento
DBL_ValorLancamento
Acho que consegui explicar
Ariovaldo
Curtidas 0
Respostas
Kotho
04/04/2005
Quando é que o pessoal vai aprender que precisamos de informações para responder as perguntas... :x
Cara, qual o banco de dados que você está utilizando.
Cara, qual o banco de dados que você está utilizando.
GOSTEI 0
Ariovaldo
04/04/2005
Kotho você não precisa ser mal educado deste jeito para ajudar os outros ajuda se você tiver vontade, até concordo que cada Banco tem suas particularidades más não são tantas assim não Ok.
se tiver afim de ajudar e é claro com boa educação e vontade estou usando Banco Firebird 1.3.05
se tiver afim de ajudar e é claro com boa educação e vontade estou usando Banco Firebird 1.3.05
GOSTEI 0
Ariovaldo
04/04/2005
Pessoal alguém poderia me Ajudar neste Select??
GOSTEI 0
Repa
04/04/2005
Ariovaldo, posso até estar dando uma dica inútil mas...
Vc poderia criar uma tabela temporária apenas c/ os campos que vc precisa...
Vc poderia criar uma tabela temporária apenas c/ os campos que vc precisa...
GOSTEI 0
Ariovaldo
04/04/2005
POderia ser até aquele ClienteDataSet da Guia DataAccess Correto?
GOSTEI 0
Marlon Spiess
04/04/2005
vc pode tentar assim
select
Departamento, VL. Deste Caixa,
(select sum(VL. Deste Caixa) from table where data >= x and data <= y) as VL. Acumulado Mês,
(select sum(VL. Deste Caixa) from table where data >= x and data <= y) as VL. Acumulado
from table, table_dep
where .......
qdo vc precisa acumular uma coluna por determinado range, faz o select dentro do select.
Espero ter ajudar
select
Departamento, VL. Deste Caixa,
(select sum(VL. Deste Caixa) from table where data >= x and data <= y) as VL. Acumulado Mês,
(select sum(VL. Deste Caixa) from table where data >= x and data <= y) as VL. Acumulado
from table, table_dep
where .......
qdo vc precisa acumular uma coluna por determinado range, faz o select dentro do select.
Espero ter ajudar
GOSTEI 0
Ariovaldo
04/04/2005
Pessoal Baseado nas informações cheguei ao resultado abaixo com esta query:
Select departamento.Li_IDDepto, sum(movimentoCaixaItem.dbl_debito)
from departamento
Left Join MovimentoCaixaItem on(MovimentoCaixaItem.Li_IDDepto = Departamento.Li_IDDepto)
Group by Departamento.Li_IDDepto
LI_IDDEPTO SUM
========== ========
1 447
2 1680
3 1666
4 2654
5 695
6 1077
7 1785
8 1411
9 156
[b:5242831371] 10 <null>
11 <null> [/b:5242831371]
99 10
POrém quando coloco o Where que para isso preciso acrescentar um Join conforme abaixo o Resultado vem errado, ou seja os campo Null não são exibidos é eu preciso que eles sejam exibidos
Select departamento.Li_IDDepto, sum(movimentoCaixaItem.dbl_debito)
from departamento
left Join MovimentoCaixaItem on(Departamento.Li_IDDepto = MovimentoCaixaItem.Li_IDDepto)
Left Join MovimentoCaixa on(MovimentoCaixaItem.Li_IDMovimentoCaixa = MovimentoCaixa.Li_IDMovimentoCaixa)
where MovimentoCaixa.DT_DataMontagem Between ´01/01/2004´ AND ´03/04/2006´
Group by Departamento.Li_IDDepto
LI_IDDEPTO SUM
========== ========
1 447
2 1680
3 1666
4 2654
5 695
6 1077
7 1785
8 1411
9 156
99 10
Select departamento.Li_IDDepto, sum(movimentoCaixaItem.dbl_debito)
from departamento
Left Join MovimentoCaixaItem on(MovimentoCaixaItem.Li_IDDepto = Departamento.Li_IDDepto)
Group by Departamento.Li_IDDepto
LI_IDDEPTO SUM
========== ========
1 447
2 1680
3 1666
4 2654
5 695
6 1077
7 1785
8 1411
9 156
[b:5242831371] 10 <null>
11 <null> [/b:5242831371]
99 10
POrém quando coloco o Where que para isso preciso acrescentar um Join conforme abaixo o Resultado vem errado, ou seja os campo Null não são exibidos é eu preciso que eles sejam exibidos
Select departamento.Li_IDDepto, sum(movimentoCaixaItem.dbl_debito)
from departamento
left Join MovimentoCaixaItem on(Departamento.Li_IDDepto = MovimentoCaixaItem.Li_IDDepto)
Left Join MovimentoCaixa on(MovimentoCaixaItem.Li_IDMovimentoCaixa = MovimentoCaixa.Li_IDMovimentoCaixa)
where MovimentoCaixa.DT_DataMontagem Between ´01/01/2004´ AND ´03/04/2006´
Group by Departamento.Li_IDDepto
LI_IDDEPTO SUM
========== ========
1 447
2 1680
3 1666
4 2654
5 695
6 1077
7 1785
8 1411
9 156
99 10
GOSTEI 0
Rjun
04/04/2005
Use Right Join em vez de Left Join.
GOSTEI 0
Ariovaldo
04/04/2005
Ainda continua o Problema
GOSTEI 0
Ariovaldo
04/04/2005
Pessoal Consegui reslver da forma que preciso, agora minha pergunta é se quando tiver muitos registros qual será a performance deste Select?
SELECT
DEPARTAMENTO.LI_IDDEPTO,
SUM(MOVIMENTOCAIXAITEM.DBL_DEBITO)
FROM
DEPARTAMENTO LEFT JOIN MOVIMENTOCAIXAITEM ON( MOVIMENTOCAIXAITEM.LI_IDDEPTO = DEPARTAMENTO.LI_IDDEPTO )
LEFT JOIN MOVIMENTOCAIXA ON( MOVIMENTOCAIXAITEM.LI_IDMOVIMENTOCAIXA = MOVIMENTOCAIXA.LI_IDMOVIMENTOCAIXA )
WHERE
( MOVIMENTOCAIXA.DT_DATAMONTAGEM BETWEEN ´03/01/2005´ AND ´04/15/2005´ ) or
( DEPARTAMENTO.LI_IDDEPTO NOT IN ( SELECT
MOVIMENTOCAIXAITEM.LI_IDDEPTO
FROM
MOVIMENTOCAIXAITEM LEFT JOIN MOVIMENTOCAIXA ON ( MOVIMENTOCAIXAITEM.LI_IDMOVIMENTOCAIXA = MOVIMENTOCAIXA.LI_IDMOVIMENTOCAIXA )
WHERE
MOVIMENTOCAIXA.DT_DATAMONTAGEM BETWEEN ´03/01/2005´ AND ´04/15/2005´ ) )
GROUP BY
DEPARTAMENTO.LI_IDDEPTO
SELECT
DEPARTAMENTO.LI_IDDEPTO,
SUM(MOVIMENTOCAIXAITEM.DBL_DEBITO)
FROM
DEPARTAMENTO LEFT JOIN MOVIMENTOCAIXAITEM ON( MOVIMENTOCAIXAITEM.LI_IDDEPTO = DEPARTAMENTO.LI_IDDEPTO )
LEFT JOIN MOVIMENTOCAIXA ON( MOVIMENTOCAIXAITEM.LI_IDMOVIMENTOCAIXA = MOVIMENTOCAIXA.LI_IDMOVIMENTOCAIXA )
WHERE
( MOVIMENTOCAIXA.DT_DATAMONTAGEM BETWEEN ´03/01/2005´ AND ´04/15/2005´ ) or
( DEPARTAMENTO.LI_IDDEPTO NOT IN ( SELECT
MOVIMENTOCAIXAITEM.LI_IDDEPTO
FROM
MOVIMENTOCAIXAITEM LEFT JOIN MOVIMENTOCAIXA ON ( MOVIMENTOCAIXAITEM.LI_IDMOVIMENTOCAIXA = MOVIMENTOCAIXA.LI_IDMOVIMENTOCAIXA )
WHERE
MOVIMENTOCAIXA.DT_DATAMONTAGEM BETWEEN ´03/01/2005´ AND ´04/15/2005´ ) )
GROUP BY
DEPARTAMENTO.LI_IDDEPTO
GOSTEI 0
Arc@njo
04/04/2005
Eu tenho a impressão que o SQL desta forma sairia melhor e melhoraria a performance tbm:
SELECT DEPARTAMENTO.LI_IDDEPTO, SUM(MOVIMENTOCAIXAITEM.DBL_DEBITO)
FROM DEPARTAMENTO
LEFT JOIN MOVIMENTOCAIXAITEM ON( MOVIMENTOCAIXAITEM.LI_IDDEPTO = DEPARTAMENTO.LI_IDDEPTO)
LEFT JOIN MOVIMENTOCAIXA ON( MOVIMENTOCAIXAITEM.LI_IDMOVIMENTOCAIXA = MOVIMENTOCAIXA.LI_IDMOVIMENTOCAIXA AND MOVIMENTOCAIXA.DT_DATAMONTAGEM BETWEEN ´03/01/2005´ AND ´04/15/2005´)
GROUP BY
DEPARTAMENTO.LI_IDDEPTO
Coloque o filtro de datas dentro da clausula ON pois assim so irao relacionar os registros daquele periodo e não o da tabela inteira, pela ordem o SQL faz, usando a clausula where, o produto cartesiano das tabelas e depois as filtra por isto não aparecia, usando na clausula ON so sera feito produto cartesiano dos registros validos.
Espero ter ajudado.
SELECT DEPARTAMENTO.LI_IDDEPTO, SUM(MOVIMENTOCAIXAITEM.DBL_DEBITO)
FROM DEPARTAMENTO
LEFT JOIN MOVIMENTOCAIXAITEM ON( MOVIMENTOCAIXAITEM.LI_IDDEPTO = DEPARTAMENTO.LI_IDDEPTO)
LEFT JOIN MOVIMENTOCAIXA ON( MOVIMENTOCAIXAITEM.LI_IDMOVIMENTOCAIXA = MOVIMENTOCAIXA.LI_IDMOVIMENTOCAIXA AND MOVIMENTOCAIXA.DT_DATAMONTAGEM BETWEEN ´03/01/2005´ AND ´04/15/2005´)
GROUP BY
DEPARTAMENTO.LI_IDDEPTO
Coloque o filtro de datas dentro da clausula ON pois assim so irao relacionar os registros daquele periodo e não o da tabela inteira, pela ordem o SQL faz, usando a clausula where, o produto cartesiano das tabelas e depois as filtra por isto não aparecia, usando na clausula ON so sera feito produto cartesiano dos registros validos.
Espero ter ajudado.
GOSTEI 0