Select com distinct e agrupamento no final

Firebird

11/10/2005

é o seguinte:

tenho uma tabela de produtos:
campo, numfabricante.

Valores:

520
521AM
521AZ
521VE
522AM
52390
52390AM
52390PR
524BR
524VE
525AM
526AM
527AM
528PR
...
...

preciso dar um select, retornando somente a parte dos numero e distinct.
ja fiz com um STOREPROCEDURE.
ele retorna

520
521
522
52390
524
525
526
527
528


baseado neste retorno,
agora preciso de um select que:

me lista este retorno + todos os valores que estes pertenciam, exemplo:

campo1, campo2
520
521 AM, AZ, VE
522 AM
52390 AM, PR
524 BR, VE
525 AM
526 AM
527 AM
528 PR


como fazer ?


Pedih

Pedih

Curtidas 0

Respostas

Afarias

Afarias

11/10/2005

faça um FOR SELECT na consulta q traz os distincts (vc já fez) e para cada resultado selecione os correspondentes q vc deseja.


T+


GOSTEI 0
Pedih

Pedih

11/10/2005

Afarias,
mas este FOR SELECT, que voce sugeriu.

ele vai retornar varias linhas.
e preciso q retorne somente uma linha.


nao compreendi.

veja minha storeprocedure para selecionar os registros distincts

create procedure pradolux (Marca
Char(10))
returns (Numfabricantenovo Varchar(20))

as
declare variable n Smallint;
declare variable i Smallint;
declare variable NumFabricante Varchar(20);
declare variable Tamanho Integer;
declare variable C Char(1);
declare variable NumFabricanteAgrupados Varchar(20);

begin
For Select
p.Numfabricante
From Produtos p
Where
p.Codmarca = :Marca
Into :Numfabricante Do
Begin

n = Rs_length(:Numfabricante);
i = 1;
Numfabricantenovo = ´´ ;
while (:I <= :n) do
Begin
C = Rs_substring(:Numfabricante, I, 1);
If (C >= ´0´ And C <= ´9´) Then
Numfabricantenovo = :Numfabricantenovo || :c;
I = :I + 1;
End
Tamanho = n;
Suspend;
end
/* Procedure Text */
end



uso assim:
Select Distinct NumFabricanteNovo pradolux(´324´);

ele retorna a lista dos numeros dos fabricantes
somente a parte dos numeros:
e distincts:
mas, desse resultado, quero que, em cada registro saia todos as informacoes refrente ao mesmo item no qual foi agrupado.

exemplo:

Antes doprocedimento:

520AM
520AZ
520BP

RETORNA:
CAMPO1----CAMPO2
520----------AM, AZ, BP.

entendeu?


GOSTEI 0
Afarias

Afarias

11/10/2005

|mas este FOR SELECT, que voce sugeriu. ele vai retornar varias linhas.
|e preciso q retorne somente uma linha.

não necessáriamente. o for SELECT pode retornar 1 ou N linhas para cada ítem do FOR, vc q decide, vc pode facilmente fazer algo como:

(obs: este exemplo usa um outro procedimento)

create procedure Teste1 (marca varchar(10)) 
  returns (NumFabNovo Varchar(10), Codigos Varchar(20)) 
as
  declare variable NumFab varchar(20);
begin
  
  for select distinct NumFabricanteNovo pradolux(´324´) 
    into :NumFabNovo do
  begin
    Codigos = ´´;
    for select NumFabricante from produtos 
      where NumFabricante starting :NumFabNovo // ?? outra função ??
      into :NumFab do
        Codigos = Codigos || ´ ´ || Substring(NumFab,?,?);
    Suspend;
  end

end^



T+


GOSTEI 0
Pedih

Pedih

11/10/2005

Afarias.

valeu: funcionou perfeitamente.

Obrigado.


GOSTEI 0
POSTAR