Select MESTRE/DETALHE sem repetir campos da tabela mestre
25/04/2013
0
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 .....
Ricardo Santos
Posts
25/04/2013
Ricardo Santos
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 ....
25/04/2013
William
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!
01/05/2013
Alvaro Vieira
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.
01/05/2013
Alvaro Vieira
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
01/09/2015
Francisco Silva
Clique aqui para fazer login e interagir na Comunidade :)