Relacionar duas tabelas e agrupar por um campo
06/11/2019
0
Tenho duas tabelas que estou unindo para recuperar os dados relacionados dessa forma:
Tabela Processos: Tabela Anexos
Com a query acima ele retorna da seguinte forma:
Processo 1 => REQUERIMENTO
Processo 1 => Apostilamento
Processo 2 => requisição
Processo 2 => REQUERIMENTO
Processo 3 => Apostilamento
Processo 3 => CRAF
O que preciso está abaixo:
Processo 1 => REQUERIMENTO
Apostilamento
Processo 2 => requisição
REQUERIMENTO
Processo 3 => Apostilamento
CRAF
Creio que é só o uso do GROUP BY mas nesse caso nao funciona.
Tabela Processos: Tabela Anexos
id | processos processoid | titulo 1 | Processo 1 1 | REQUERIMENTO 2 | Processo 2 1 | Apostilamento 3 | Processo 3 2 | requisição 4 | Processo 4 2 | REQUERIMENTO 5 | Processo 5 3 | Apostilamento 6 | Processo 6 3 | CRAF
SELECT processos.processos, processos.id as processoid, anexos.*, anexos.id as anexoid FROM anexos INNER JOIN processos ON (processos.id = anexos.processoid) GROUP By processos.id ORDER By anexos.processoid
Com a query acima ele retorna da seguinte forma:
Processo 1 => REQUERIMENTO
Processo 1 => Apostilamento
Processo 2 => requisição
Processo 2 => REQUERIMENTO
Processo 3 => Apostilamento
Processo 3 => CRAF
O que preciso está abaixo:
Processo 1 => REQUERIMENTO
Apostilamento
Processo 2 => requisição
REQUERIMENTO
Processo 3 => Apostilamento
CRAF
Creio que é só o uso do GROUP BY mas nesse caso nao funciona.
José Damascena
Curtir tópico
+ 0
Responder
Posts
14/01/2020
Vinicíus Neto
UPDATE estoque
SET estoque.teste = (select est.qtoba
FROM est where est.codigo = estoque.codigo)
Segui este exemplo pra copiar os dados da coluna est.qtoba pra coluna estoque.teste, mas resulta em null em todas as linhas, o que pode estar acontecendo, o dados de este estão perfeitos que já observei no select, mas eles não gravam na coluna teste.
Pode me ajudar?
Grato
SET estoque.teste = (select est.qtoba
FROM est where est.codigo = estoque.codigo)
Segui este exemplo pra copiar os dados da coluna est.qtoba pra coluna estoque.teste, mas resulta em null em todas as linhas, o que pode estar acontecendo, o dados de este estão perfeitos que já observei no select, mas eles não gravam na coluna teste.
Pode me ajudar?
Grato
Responder
15/01/2020
Anderson Gonçalves
Fala boy,
Seguinte...
Você está com o relacionamento de forma errada, veja que você tem uma tabela PROCESSOS, outra com o nome de ANEXO e não tem uma tabela de ligação entre elas e nesse seu exemplo é necessário.
PROCESSO
PRCCODIGO INT NOTNULL PK
PRCDESCRICAO VARCHAR(30) NOTNULL
ANEXO
ANXCODIGO INT NOTNULL PK
ANXDESCRICAO VARCHAR(30) NOTNULL
TABELA DE LIGAÇÃO NECESSÁRIA
PROCESSO_ANEXO
PRCANXCODIGO INT NOTNULL PK
PRCCODIGO INT NOTNULL FK
ANXCODIGO INT NOTNULL FK
OBS1:
EXISTEM TÉCNICAS A SE SEGUIR, UMA DELAS É A MAIS SIMPLES, OU VOCÊ USA OS NOMES DAS TABELAS EM SINGULAR OU PLURAL, NÃO PODE VARIAR O TEMPO TODO, PADRÃO PALAVRA DE ORDEM PARA INFORMÁTICA.
OBS2:
NOMENCLATURA DE CAMPOS É NECESSÁRIO PARA QUE ALGUM DIA VOCÊ POSSA CONTAR COM ALGUÉM PARA AJUDAR VOCÊ, SE NÃO HOUVER UM PADRÃO DE NOMENCLATURA DOS CAMPOS O PROGRAMADOR VAI SE PERDER E NÃO VAI CONSEGUIR AJUDAR TÃO FÁCIL, ATÉ MESMO VOCÊ PODE SE PERDER SE NÃO TIVER PADRÃO, COM O TEMPO QUE VOCÊ NÃO MEXER NO PROGRAMA VOCÊ VAI ESQUECER O QUE VOCÊ ABREVIOU.
SEGUINDO...
PROCESSO
COD - DESCRICAO
1. PROCESSO 1
2. PROCESSO 2
3. PROCESSO 3
4. PROCESSO 4
5. PROCESSO 5
6. PROCESSO 6
ANEXO
COD - DESCRICAO
1. APOSTILAMENTO
2. REQUISIÇÃO
3. CRAF
PROCESSO_ANEXO
COD(SEQ) CODPROCESSO CODANEXO
1. - 2. PROCESSO 2 - 1. APOSTILAMENTO
2. - 3. PROCESSO 3 - 2. REQUISIÇÃO
3. - 4. PROCESSO 4 - 2. REQUISIÇÃO
4. - 5. PROCESSO 5 - 3. CRAF
5. - 6. PROCESSO 6 - 3. CRAF
6. - 2. PROCESSO 2 - 2. REQUISIÇÃO
7. - 2. PROCESSO 2 - 3. CRAF
//-- OBSERVE QUE A SUA LEGENDA ESTÁ INCORRETA E EU INCREMENTEI MAIS CAMPOS PARA EXEMPLIFICAR MELHOR --
REQUERIMENTO
2 | Processo 2 1 | Apostilamento
3 | Processo 3 2 | requisição
4 | Processo 4 2 | REQUERIMENTO
5 | Processo 5 3 | Apostilamento
6 | Processo 6 3 | CRAF
// -------------------------------------------------------
Agora sim vamos lá.
Faça:
select
proc.*,
anx.*,
panexo.prcanxcodigo
from
processo_anexo panexo
inner join processo proc
on proc.prccodigo = panexo.prccodigo
inner join anexo anx
on anx.anxcodigo = panexo.anxcodigo
order by proc.prcdescricao, anx.anxdescricao
Você terá o resultado:
PRCCODIGO PRCDESCRICAO ANXCODIGO ANXDESCRICAO PRCANXCODIGO
2 PROCESSO 2 1 APOSTILAMENTO 1
2 PROCESSO 2 3 CRAF 7
2 PROCESSO 2 2 REQUISIÇÃO 6
3 PROCESSO 3 2 REQUISIÇÃO 2
4 PROCESSO 4 2 REQUISIÇÃO 3
5 PROCESSO 5 3 CRAF 4
6 PROCESSO 6 3 CRAF 5
SIMPLIFICADO
PROCESSO 2 - APOSTILAMENTO
PROCESSO 2 - CRAF
PROCESSO 2 - REQUISIÇÃO
PROCESSO 3 - REQUISIÇÃO
PROCESSO 4 - REQUISIÇÃO
PROCESSO 5 - CRAF
PROCESSO 6 - CRAF
Tá ai o que você queria,
Espero ter ajudar.
qualquer coisa entre em contato te dou mais uma ajudinha.
skype: anderson@case13.com.br
Seguinte...
Você está com o relacionamento de forma errada, veja que você tem uma tabela PROCESSOS, outra com o nome de ANEXO e não tem uma tabela de ligação entre elas e nesse seu exemplo é necessário.
PROCESSO
PRCCODIGO INT NOTNULL PK
PRCDESCRICAO VARCHAR(30) NOTNULL
ANEXO
ANXCODIGO INT NOTNULL PK
ANXDESCRICAO VARCHAR(30) NOTNULL
TABELA DE LIGAÇÃO NECESSÁRIA
PROCESSO_ANEXO
PRCANXCODIGO INT NOTNULL PK
PRCCODIGO INT NOTNULL FK
ANXCODIGO INT NOTNULL FK
OBS1:
EXISTEM TÉCNICAS A SE SEGUIR, UMA DELAS É A MAIS SIMPLES, OU VOCÊ USA OS NOMES DAS TABELAS EM SINGULAR OU PLURAL, NÃO PODE VARIAR O TEMPO TODO, PADRÃO PALAVRA DE ORDEM PARA INFORMÁTICA.
OBS2:
NOMENCLATURA DE CAMPOS É NECESSÁRIO PARA QUE ALGUM DIA VOCÊ POSSA CONTAR COM ALGUÉM PARA AJUDAR VOCÊ, SE NÃO HOUVER UM PADRÃO DE NOMENCLATURA DOS CAMPOS O PROGRAMADOR VAI SE PERDER E NÃO VAI CONSEGUIR AJUDAR TÃO FÁCIL, ATÉ MESMO VOCÊ PODE SE PERDER SE NÃO TIVER PADRÃO, COM O TEMPO QUE VOCÊ NÃO MEXER NO PROGRAMA VOCÊ VAI ESQUECER O QUE VOCÊ ABREVIOU.
SEGUINDO...
PROCESSO
COD - DESCRICAO
1. PROCESSO 1
2. PROCESSO 2
3. PROCESSO 3
4. PROCESSO 4
5. PROCESSO 5
6. PROCESSO 6
ANEXO
COD - DESCRICAO
1. APOSTILAMENTO
2. REQUISIÇÃO
3. CRAF
PROCESSO_ANEXO
COD(SEQ) CODPROCESSO CODANEXO
1. - 2. PROCESSO 2 - 1. APOSTILAMENTO
2. - 3. PROCESSO 3 - 2. REQUISIÇÃO
3. - 4. PROCESSO 4 - 2. REQUISIÇÃO
4. - 5. PROCESSO 5 - 3. CRAF
5. - 6. PROCESSO 6 - 3. CRAF
6. - 2. PROCESSO 2 - 2. REQUISIÇÃO
7. - 2. PROCESSO 2 - 3. CRAF
//-- OBSERVE QUE A SUA LEGENDA ESTÁ INCORRETA E EU INCREMENTEI MAIS CAMPOS PARA EXEMPLIFICAR MELHOR --
REQUERIMENTO
2 | Processo 2 1 | Apostilamento
3 | Processo 3 2 | requisição
4 | Processo 4 2 | REQUERIMENTO
5 | Processo 5 3 | Apostilamento
6 | Processo 6 3 | CRAF
// -------------------------------------------------------
Agora sim vamos lá.
Faça:
select
proc.*,
anx.*,
panexo.prcanxcodigo
from
processo_anexo panexo
inner join processo proc
on proc.prccodigo = panexo.prccodigo
inner join anexo anx
on anx.anxcodigo = panexo.anxcodigo
order by proc.prcdescricao, anx.anxdescricao
Você terá o resultado:
PRCCODIGO PRCDESCRICAO ANXCODIGO ANXDESCRICAO PRCANXCODIGO
2 PROCESSO 2 1 APOSTILAMENTO 1
2 PROCESSO 2 3 CRAF 7
2 PROCESSO 2 2 REQUISIÇÃO 6
3 PROCESSO 3 2 REQUISIÇÃO 2
4 PROCESSO 4 2 REQUISIÇÃO 3
5 PROCESSO 5 3 CRAF 4
6 PROCESSO 6 3 CRAF 5
SIMPLIFICADO
PROCESSO 2 - APOSTILAMENTO
PROCESSO 2 - CRAF
PROCESSO 2 - REQUISIÇÃO
PROCESSO 3 - REQUISIÇÃO
PROCESSO 4 - REQUISIÇÃO
PROCESSO 5 - CRAF
PROCESSO 6 - CRAF
Tá ai o que você queria,
Espero ter ajudar.
qualquer coisa entre em contato te dou mais uma ajudinha.
skype: anderson@case13.com.br
Responder
Clique aqui para fazer login e interagir na Comunidade :)