Consulta SQL

36 respostas
mysql
FabioSaid

Galera, como que eu retorno duas colunas a partir de uma coluna no SQL Server ? Meu problema é o seguinte :
Tenho uma tabela pessoa e nessa tabela pessoa,
eu tenho a coluna de ‘nomepessoa’, nessa coluna eu tenho os nomes de ‘funcionarios e clientes’, depois eu tenho um campo com o tipo de pessoa, clientes = 1 e funcionario = 2.
Eu já fiz o where para pegar os clientes e funcionario, só que eu tenho que exibir eles em outras duas colunas…
Exemplo : Coluna funcionario: ‘apenas funcionarios’ , Coluna clientes : ‘apenas clientes’.

36 Respostas

V
select * from (
select nome as cliente, ' ' as funcionario
from pessoa 
where tipo = 1
union
select ' ' as cliente, nome as funcionario
from pessoa 
where tipo = 2)
FabioSaid

Cara, muito obrigado !
Mas seria possível retirar esses espaços ?
Tipo , mostrar o cliente na linha 1 igual está o funcionario ?

duvida

V

Qual seria a relação para esta união? Certamente vai existir diferenças entre a quantidades dai vai ficar parte de uma das colunas em branco.
Podemos simular um relacionamento pelo nro da linha ex:

select CLIENTES.NOME, FUNCIONARIOS.NOME
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS LINHA, NOME 
FROM PESSOA
WHERE TIPO = 1) AS CLIENTES
(SELECT ROW_NUMBER() OVER(ORDER BY name ASC) AS LINHA, NOME 
FROM PESSOA
WHERE TIPO = 2) AS FUNCIONARIOS
WHERE CLIENTES.LINHA = FUNCIONARIOS.LINHA

Eu nunca trabalhei com sqlserver mas acho que seria mais ou menos assim.

FabioSaid

É o seguinte,eu vou ter que colocar essa consulta dentro de uma outra consulta bem maior… eu estou trabalhando com uma importacao de dados para um sistem novo e
para dar certo, eu preciso retirar as partes em branco.

olha o jeito que está essa parte :

SELECT RESULTADO.Mae , RESULTADO.Pai  FROM (

SELECT  DISTINCT mae.nomepessoa as Mae,''as Pai FROM  dbo.bpm_pessoa mae 
 INNER JOIN dbo.bpm_pessoarelacionamento maerelacionamento on
  maerelacionamento.idpessoaprincipal = mae.idpessoa where maerelacionamento.idtiporelacionamentopessoa = 3 
UNION
SELECT DISTINCT '' as pai,pai.nomepessoa as pai FROM dbo.bpm_pessoa AS  pai 
INNER JOIN dbo.bpm_pessoarelacionamento pairelacionamento on 
pairelacionamento.idpessoaprincipal = pai.idpessoa where pairelacionamento.idtiporelacionamentopessoa = 2
)
AS RESULTADO

Quando eu falei de ‘funcionarios’ e ‘clientes’ era só um exemplo. para eu conseguir fazer.

D1

T

Da pra voce criar duas Classes uma funcionario e outra como clientes… dentro dessa classe vc colaca um atriburo (Integer id; por exemplo) e dentro da sua estrutura da captura das pessoas voce separa elas com um fi se o id for 1 seria clientes se for 2 seria funcionarios. separando joga eles numa lista e depois manda setar em uma nova tabela dentro so seu banco de dados ja separando uma tabela de clientes e um de funcionarios… nao sei se consegui ajudar… mas se postar seu codigo aqui eu tento ajudar vc a melhorar ele… também estou treinando e qualquer desafio que vier eu to topando… abrass.

FabioSaid

É o seguinte : a empresa trabalha com tecnologia própria, eu não tenho acesso a varias partes do sistema… essa demanda veio e eu só recebi a base de dados, e preciso fazer uma consulta que traga todos os campos (citados no documento) e formatados do jeito que eles querem. entendeu ? depois que eu terminar a consulta, eu simplesmente vou gerar um excel e mandar pra eles…e não vou mais ficar por dentro do processo…mas obrigado pela ajuda

rcarvalhoalencar
select
P.nomepessoas as Clientes,
S.nomepessoas as Funcionarios
from nomedatablea as P
inner join nomedatabela as S
where P.tipo='0' and S.tipo='1';

Só editar o nome das tabelas e colunas de acordo com seu banco de dados executar e ser feliz.

FabioSaid

@rcarvalhoalencar, desse jeito não vai dar certo, olha o script:

SELECT  RESULTADO.Mae , RESULTADO.Pai  FROM (
SELECT  DISTINCT mae.nomepessoa as Mae,''as Pai FROM  dbo.bpm_pessoa mae 
 INNER JOIN dbo.bpm_pessoarelacionamento maerelacionamento on
  maerelacionamento.idpessoaprincipal = mae.idpessoa where 
 maerelacionamento.idtiporelacionamentopessoa = 3 
UNION

SELECT DISTINCT '' as pai,pai.nomepessoa as pai FROM
dbo.bpm_pessoa AS  pai 
INNER JOIN dbo.bpm_pessoarelacionamento pairelacionamento on 
pairelacionamento.idpessoaprincipal = pai.idpessoa where 
pairelacionamento.idtiporelacionamentopessoa = 2
)
AS RESULTADO
rcarvalhoalencar

Por favor, diga o nome das tabelas e as colunas que você precisa de cada uma.
Ex:
tabela1 > coluna1, coluna2
tabela2 > coluna1, coluna2

FabioSaid

tabela : bpm_pessoa
Campos : nomepessoa

tabela : bpm_pessoarelacionamento
Campos : idtiporelacionamentopessoa

na tabela de (bpm_pessoa) e no campo (nomepessoa) tem as informacoes de pessoas

na tabela (bpm_pessoarelacionamento) no campo (idtiporelacionamentopessoa) tem o identificador de pessoa
Exemplo idtiporelacionamentopessoa = 3 – é mae
idtiporelacionamentopessoa = 2 – é pai

Qual o resultado que eu preciso ?
: Exibir duas colunas, sendo , uma coluna com ‘Pai’ e outra coluna com ‘Maes’ entendeu ?

Atualmente como a imagem

rcarvalhoalencar

Realmente quem criou seu Banco de Dados quis dificultar. Deveria ter usado uma chave estrangeira para identificar a que pessoa pertence a mãe ou o pai. sem isso não tem como fazer uma lista segura de que cada pai e mãe que aparecerem na linha vão ser da msm pessoa.

Dragoon

Até agora não entendi sua duvida! Tem como explicar o que acontece na realidade?

V

Teoricamente esta tabela de relacionamento deveria ter no minimo 3 colunas: 1 com o idPrincipal, outra com o idDoRelacionamento e uma com o tipo do relacionamento.
se tiver as 3 colunas teu problema esta fácil de se resolver.

Cleiton_Conceicao

pelo que eu tendi todas as informações estão na mesma tabela. tu pode fazer com subquerys
ex…
select
(select nomepessoa from pessoa where pessoa.codigoPessoa=p.codigoPessoa and p.tipo_pessoa=1) as Clientes,
(select nomepessoa from pessoa where pessoa.codigoPessoa=p.codigoPessoa and p.tipo_pessoa=2) as Clientes,
from pessoa p

como vc não falou qual o campo chave da tabela pessoa passei uma coluna qualquer.

FabioSaid

Sao duas tabelas…
na tabela bpm_pessoa eu tenho o nome das pessoas,
na tabela dbo.bpm_pessoarelacionamento eu tenho
o idrelacionamento que diz se é pai ou mae.
Eu preciso tirar dessa consulta, duas colunas :
uma com as ‘Maes’ e outra com os ‘Pais’.

sao2tabelas

Dragoon

Quais Campos São das duas tabelas e explique cada um, eu acho que.inner Join resolve,mas preciso da explicação quais são os campos

FabioSaid

Campos:

  • idpessoaprincipal,
  • idpessoasecundaria,
  • idtiporelacionamento

são da tabela dbo.bpm_pessoarelacionamento.

e

  • nomepessoa

é da tabela bpm_pessoa.


Olha como está minha consulta

"SELECT  RESULTADO.Mae , RESULTADO.Pai FROM (
SELECT  DISTINCT mae.nomepessoa as Mae,''as Pai 
  FROM dbo.bpm_pessoa mae 
  INNER JOIN dbo.bpm_pessoarelacionamento maerelacionamento 
  on maerelacionamento.idpessoaprincipal = mae.idpessoa 
  where maerelacionamento.idtiporelacionamentopessoa = 3 

UNION

SELECT DISTINCT '' as pai,pai.nomepessoa as pai
 FROM dbo.bpm_pessoa AS  pai 
 INNER JOIN dbo.bpm_pessoarelacionamento pairelacionamento 
 on pairelacionamento.idpessoaprincipal = pai.idpessoa 
 where pairelacionamento.idtiporelacionamentopessoa = 2
) AS RESULTADO"

e a forma que ela está retornando:

Repara que ela está primeiro carregando os pais e depois exibe as mães.

Esse é o problema, eu não consigo fazer com que a consulta carregue as mães nas primeiras linhas, eu preciso que fique alinhado, pai de um lado e mãe de outro.

Cleiton_Conceicao

Se o campo de relacionamento de uma tabela pra outra for realmente PR.idpessoa =P.idpessoaprincipal.
isso aqui te atende…
SELECT

(SELECT nomepessoa FROM bpm_pessoarelacionamento PR WHERE PR.idpessoa =P.idpessoaprincipal AND idtiporelacionamentopessoa = 3 ) AS MAE,
(SELECT nomepessoa FROM bpm_pessoarelacionamento PR WHERE PR.idpessoa =P.idpessoaprincipal AND idtiporelacionamentopessoa = 2 ) AS PAi,

FROM bpm_pessoa P

vou te dar uma dica de modelagem de banco…
sempre cria o relacionamento das tabelas com os nomes das colunas iguais.

em vez de ser assim…PR.idpessoa =P.idpessoaprincipal
tu botaria assim .PR.idpessoa =P.idpessoa

Dragoon

Não funciona porque cada SQL dessa traz mais de um registro. O problema ai é que o cara quis economizar e saiu caro.

Dragoon

Qual linguagem você está usando? como saber se o usuário tem pai ou mãe? qual a relação que deve ser feita pra saber se uma pessoa está cadastrada pai e também mãe ou somente alguma delas, ou nenhuma?

Observação: acho melhor resolver na linguagem!

FabioSaid

essa base de dados nao é minha

FabioSaid

Galera, eu nao tenho acesso a esse sistema , estou trabalhando em cima de uma base de dados que nao fui eu quem fiz…eu recebi essa base de dados na minha mao, e eles me pediram para fazer uma extracao de dados, parte dessa extracao envolve trazer pai e mae.

Dragoon

Crie uma tabela e extrai os dados com StoredProcedure, while e tudo mais

V

Creio que seria isto aqui, pois não testei:

select principal.nomepessoa as principal, mae.nomepessoa as mae, pai.nomepessoa as pai
from bpm_pessoa principal
left outer join bpm_pessoarelacionamento rpai on (principal.idpessoa = rpai.idpessoaprincipal and rpai.idtiporelacionamento = 2)
left outer join bpm_pessoa pai on (rpai.idpessoasecundaria = pai.idpessoa)
left outer join bpm_pessoarelacionamento rmae on (principal.idpessoa = rmae.idpessoaprincipal and rmae.idtiporelacionamento = 3)
left outer join bpm_pessoa mae on (rmae.idpessoasecundaria = mae.idpessoa)

FabioSaid

Ainda assim deu errado. Olha só
olhaResultado

FabioSaid

Vou disponibilizar a tabela para você dar uma olhada melhor
Tabelas : bpm_pessoa , bpm_pessoarelacionamento
me manda seu e-mail, nao consigo mandar postar aq

Cleiton_Conceicao

Manda pra mim tbm, se tiver os inserts melhor ainda
[email removido]

FabioSaid

Galera, me mandaram outra base de dados que tem uma tabela com informações de pai e mae, acho que agora fica mais facil para fazer…
Vou dar um select * from nela aqui e mandar imagem.
t

FabioSaid

Agora sao duas bases de dados, se vocês quiserem que eu mande para vocês. É só me mandar o e-mail.

Dragoon

Todo mundo é cadastrado em um tabela pessoa, ou seja, todas as pessoas sendo pai ou mãe e etc, são cadastrados na mesma tabela?

FabioSaid

Sim…Exatamente isso

Dragoon
  • O que define quem é o Pai e a Mãe de uma pessoa?
  • Tem como exemplificar?

Por o exemplo codigo 1 é pai de codigo 2 e 3 e codigo 2 é mae de 2 e 3 ??? (veja o balaio de gato)

Tem como exemplificar, tem como montar a regra de negócio acho eu que isso só da para resolver com StoreProcedure fazendo um tabela temporária para retorno, porque os dados vão se repetir ou não dependendo como foi montado, porque um pai e mãe pode ter mais de um filho!

FabioSaid

pai = 2 , mae = 3
bpm_pessoarelacionamento(idtiporelacionamento) - diz o relacionamento
bpm_pessoa - nome das pessoas (mae,pai,funcionarios)

Dragoon

e ???

Porque isso não resolve, mostre um exemplo de id com pai e filho, tem como?

FabioSaid

Consegui resolver,pessoal

select
p.nomepessoa
,mae.nomepessoa
,pai.nomepessoa
from bpm_dadosfuncionario  func

inner join dbo.bpm_pessoa p
    on p.idpessoa = func.idpessoa
inner join dbo.bpm_pessoarelacionamento pr1
	on pr1.idpessoasecundaria = p.idpessoa
inner join dbo.bpm_pessoa mae
	on mae.idpessoa = pr1.idpessoaprincipal and pr1.idtiporelacionamentopessoa = 3
inner join dbo.bpm_pessoarelacionamento pr2
	on pr2.idpessoasecundaria = p.idpessoa
inner join dbo.bpm_pessoa pai
	on pai.idpessoa = pr2.idpessoaprincipal and pr2.idtiporelacionamentopessoa = 2
rcarvalhoalencar

Parabéns. Essa tabela estava bem mal organizada.

Criado 17 de março de 2019
Ultima resposta 22 de mar. de 2019
Respostas 36
Participantes 6