Select MESTRE/DETALHE sem repetir campos da tabela mestre

25/04/2013

2

Bom dia pessoal ....

Tô c/ um "pequeno" probleminha ... tenho um select MESTRE/DETALHE "normal":

SELECT C.STR_NF
, C.DBL_TOTALPRODUTOS
, I.STR_CODIGOPRODUTO
, I.DBL_TOTALPRODUTO
FROM CAPA_NF AS C
LEFT JOIN ITEM_NF AS I ON C.LI_SEQNF = I.LI_SEQNF
AND C.STR_NF = I.STR_NF
AND C.STR_CODIGOEMITENTE = I.STR_CODIGOEMITENTE
WHERE C.LI_SEQNF = 41
AND C.STR_NF = '9194'
AND C.STR_CODIGOEMITENTE = '000001'

Ao executar o select são exibidos os registros:


STR_NF DBL_TOTALPRODUTOS STR_CODIGOPRODUTO DBL_TOTALPRODUTO
------ ----------------- ---------------- ----------------
9194 13.861,32 ITEM 001 2.267,22
9194 13.861,32 ITEM 002 4.479,44
9194 13.861,32 ITEM 003 2.390,89
9194 13.861,32 ITEM 004 4.723,77


O que preciso na realidade e q a informação do campo STR_NF se repita apenas
na PRIMEIRA linha, dessa forma:

STR_NF DBL_TOTALPRODUTOS STR_CODIGOPRODUTO DBL_TOTALPRODUTO
------ ----------------- ---------------- ----------------
9194 13.861,32 ITEM 001 2.267,22
13.861,32 ITEM 002 4.479,44
13.861,32 ITEM 003 2.390,89
13.861,32 ITEM 004 4.723,77

Sei q isso é possível pois já ví em ALGUM LUGAR .. .

Alguém poderia me ajudar ???

Desde já, agradeço .....
Responder

Posts

25/04/2013

Ricardo Santos

Pessoal, sou eu novamente ...

Na verdade no meu EXEPLO acima houve um erro ....

Tanto a coluna STR_NF qto a coluna DBL_TOTALPRODUTOS (tabela MESTRE: Capa_NF),
devem aparecer apenas na primeira linha ...


STR_NF DBL_TOTALPRODUTOS STR_CODIGOPRODUTO DBL_TOTALPRODUTO
------ ----------------- ---------------- ----------------
9194 13.861,32 ITEM 001 2.267,22
ITEM 002 4.479,44
ITEM 003 2.390,89
ITEM 004 4.723,77

Obrigado, e desculpem o engano ....

Responder

25/04/2013

William

Colega já trabalho com instruções SQL a vários anos e esse tipo de consulta que você quer exibir realmente nunca vi em nível de banco de dados, o que pode ser feito é trabalhar a interface com o usuário para aproxima-la das suas necessidades.

São várias linhas (Registros) de retorno da mesma instrução SQL, se fosse para agrupar resultados de uma coluna em apenas uma linha você poderia usar a função LIST do firebird, mas acredito que não seja o seu caso.

Caso você encontre a solução para o seu problema fora do fórum por favor compartilhe conosco!
Responder

01/05/2013

Alvaro Vieira

Olá.
O seu exemplo está um pouco confuso porque na sua instrução SQL há apenas 4 colunas, mas na lista aparecem 5 e depois você quer que listem apenas 3.
Ao que parece você está tentando eliminar algumas colunas no select e isso não é possível, ou quase.
Para poder tentar te ajudar, usei 3 tabelas do meu banco de dados porque tive que testar as querys:
PV = Pedido de Venda
PV_ITEM = Item do Pedido de Venda
CONTATO = Cliente do Pedido de Venda
Creio que assim reproduza o seu exemplo. Não sei se é a forma mais elegante, mas veja o que fiz:

Estado inicial:
select p.cc_idpv, c.cc_nome, pi.cc_item, pi.cc_idproduto
from pv p
join contato c on c.cc_idcontato = p.cc_idclifor
join pv_item pi on p.cc_idpv =pi.cc_idpv
where (p.cc_idpv = 34 or p.cc_idpv = 38) and pi.cc_item < 4
order by p.cc_idpv, pi.cc_item

Resultado: observe que houve a mesma repetição do seu exemplo

CC_IDPV	CC_NOME			CC_ITEM	CC_IDPRODUTO
34	CONSTRUTORA HOSS LTDA	1	271
34	CONSTRUTORA HOSS LTDA	2	260
34	CONSTRUTORA HOSS LTDA	3	258
38	GAFISA S/A		1	56
38	GAFISA S/A		2	56
38	GAFISA S/A		3	59

Primeira possibilidade: observe que não há como listar várias colunas

select
    case
        when pi.cc_item = (select min(cc_item) from pv_item pi2 where pi2.cc_idpv = p.cc_idpv)
        then p.cc_idpv||' '||c.cc_nome||' '||pi.cc_item||' '||pi.cc_idproduto
        else pi.cc_item||' '||pi.cc_idproduto
    end coluna_1
from pv p
join contato c on c.cc_idcontato = p.cc_idclifor
join pv_item pi on p.cc_idpv =pi.cc_idpv
where (p.cc_idpv = 34 or p.cc_idpv = 38) and pi.cc_item < 4
order by p.cc_idpv, pi.cc_item

Resultado:

COLUNA_1
34 CONSTRUTORA HOSS LTDA 1 271
2 260
3 258
38 GAFISA S/A 1 56
2 56
3 59



Segunda possibilidade: você terá várias colunas, porém também terá linhas em branco na COLUNA_1
select
    case
        when pi.cc_item = (select min(cc_item) from pv_item pi2 where pi2.cc_idpv = p.cc_idpv)
        then cast(p.cc_idpv as varchar(5))||' '||c.cc_nome
        else ''
    end coluna_1,
    pi.cc_item,pi.cc_idproduto
from pv p
join contato c on c.cc_idcontato = p.cc_idclifor
join pv_item pi on p.cc_idpv =pi.cc_idpv
where (p.cc_idpv = 34 or p.cc_idpv = 38) and pi.cc_item < 4
order by p.cc_idpv, pi.cc_item

Resultado:

COLUNA_1			CC_ITEM	CC_IDPRODUTO
34 CONSTRUTORA HOSS LTDA	1	271
				2	260
				3	258
38 GAFISA S/A			1	56
				2	56
				3	59

Observe que os campos iniciados com CC_ID são inteiros e no Firebird 2.5 não houve a necessidade de usar a transformação p/ string(CAST).
Faça as alterações na sua query se achar que a solução te atende.
Abraço.
Responder

01/05/2013

Alvaro Vieira

Amigo, esse site é muito ruim, já reclamei sobre a visualização aos moderadores, mas nenhuma providência foi tomada. Por isso quase não respondo mais nada aqui.

Vou tentar listar os resultados mais uma vez, mas se não sair em colunas, paciência, pois não tenho como dar um preview antes de enviar a resposta.
Abraço.

1o. Resultado: observe que houve a mesma repetição do seu exemplo

CC_IDPV CC_NOME CC_ITEM CC_IDPRODUTO
34 CONSTRUTORA HOSS LTDA 1 271
34 CONSTRUTORA HOSS LTDA 2 260
34 CONSTRUTORA HOSS LTDA 3 258
38 GAFISA S/A 1 56
38 GAFISA S/A 2 56
38 GAFISA S/A 3 59

--------

2o. Resultado:

COLUNA_1
34 CONSTRUTORA HOSS LTDA 1 271
2 260
3 258
38 GAFISA S/A 1 56
2 56
3 59

--------

3o. Resultado:

COLUNA_1 CC_ITEM CC_IDPRODUTO
34 CONSTRUTORA HOSS LTDA 1 271
2 260
3 258
38 GAFISA S/A 1 56
2 56
3 59

Responder
Não é só o site q é ruim. Certa vez joguei uma grana no bacio assinando por um período. Faço pesquisas há alguns anos e nunca encontrei uma solução sequer. Só falta-me um pouco de vontade de configurar o bloqueio pra não entrar nas minhas pesquisas. Se existe o cúmulo da inutilidade, este é o dito cujo!
Responder