GARANTIR DESCONTO

Fórum Ajuda em SQL para relatório #275392

04/04/2005

0

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


Ariovaldo

Ariovaldo

Responder

Posts

04/04/2005

Kotho

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.


Responder

Gostei + 0

04/04/2005

Ariovaldo

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


Responder

Gostei + 0

04/04/2005

Ariovaldo

Pessoal alguém poderia me Ajudar neste Select??


Responder

Gostei + 0

04/04/2005

Repa

Ariovaldo, posso até estar dando uma dica inútil mas...
Vc poderia criar uma tabela temporária apenas c/ os campos que vc precisa...


Responder

Gostei + 0

04/04/2005

Ariovaldo

POderia ser até aquele ClienteDataSet da Guia DataAccess Correto?


Responder

Gostei + 0

04/04/2005

Marlon Spiess

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


Responder

Gostei + 0

05/04/2005

Ariovaldo

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


Responder

Gostei + 0

05/04/2005

Rjun

Use Right Join em vez de Left Join.


Responder

Gostei + 0

05/04/2005

Ariovaldo

Ainda continua o Problema


Responder

Gostei + 0

06/04/2005

Ariovaldo

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


Responder

Gostei + 0

14/04/2005

Arc@njo

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.


Responder

Gostei + 0

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

Aceitar