[URGENTE] Agrupar registros de 2 tabelas diferentes

SQL Server

09/08/2013

Olá pessoal,
bom, eu tenho a seguinte ocasião:
2 tabelas

ESCRITURA :
Codigo,
Descricao,
...
e
ESCRITURAPESSOA :
Codigo,
CodEsc,
CodigoPessoa,
..
ou seja eu poderei ter várias pessoas para uma escritura, então eu gostaria de uma select que traga o seguinte resultado se possivel:
OBS: Simulação com duas pessoas para uma Escritura.

CodEsc | CodigoPessoa | CodigoPessoa |
2 134 516

pois atualmente a select que eu estou fazendo está trazendo assim :

CodEsc | CodigoPessoa
2 134
2 516

Espero terem entendido minha explicação, desde já agradeço pessoal.
Fico no aguardo de ajuda.
Luis Flores

Luis Flores

Curtidas 0

Respostas

Luis Flores

Luis Flores

09/08/2013

correção :

CodEsc | CodigoPessoa | CodigoPessoa |
2 | 134 | 516



CodEsc | CodigoPessoa
2 | 134
2 | 516
GOSTEI 0
Alex Lekao

Alex Lekao

09/08/2013

Ola Luis, Boa tarde!!!

Tente assim para ver se funcina.

select
e.CodEsc,
ep.CodigoPessoa,
ep.CodigoPessoa
from escritura as e
left join escriturapessoa as ep on ep.codesc = e.codigo

nao sei se seria exatamente isso.

se tivesse a estrutura melhor da tabela talvez ficasse mais tranquilo para ajustar.

Espero ter ajudado.

Abraco.

Alex - Lekao
GOSTEI 0
Luis Flores

Luis Flores

09/08/2013

Alex, valeu pela ajuda,
mas ainda continua me trazendo o mesmo resultado
é que assim na verdade eu queria mostrar em uma linha de registro apenas o código da escritura, e ao lado o codigo das pessoas envolvidas seja quantas forem
entende ?

valeu
GOSTEI 0
Alex Lekao

Alex Lekao

09/08/2013

entendi...

tente mudar o left para inner e ve se funciona.

sem uma estruta mais clara da tabela fica mais dificil.

mas eu entendi que seria aquilo.

aqui na empresa faco esse tipo de coisa com uma certa frequencia.

vamos ver se conseguimos chegar em algo que resolva.

mude o left para inner e ve se funciona.
GOSTEI 0
Luis Flores

Luis Flores

09/08/2013

ainda assim, continua a mesma =(
GOSTEI 0
Alex Lekao

Alex Lekao

09/08/2013

Oi Luis, bom dia!!!

Tenta assim e ve se funciona.

select
e.codigo,
ep.codigopessoa
from escritura as e
left join escriturapessoa as ep on ep.codesc = e.codigo]
group by e.codigo,ep.codigopessoa

Nao sei se esta igual ao anterior mas tudo bem.
GOSTEI 0
Luis Flores

Luis Flores

09/08/2013

ainda assim obtive o mesmo resultado anterior,
essa select ta foda kkk
GOSTEI 0
Daniel Costa

Daniel Costa

09/08/2013

Vê se eu entendi se a escritura tiver 3 pessoas serão 3 colunas com os códigos da pessoas ????

GOSTEI 0
Daniel Costa

Daniel Costa

09/08/2013

Fim um cara aqui rápido pelo menos para dar uma luz

Onde estão as variáveis do tipo table use sua tabela

A saída pra isso é usar PIVOT..

Abraços

declare @ESCRITURA table (codigo varchar(20), escritura varchar(20))
declare @ESCRITURAPESSOA table (codesc varchar(20), codpessoa varchar(20))

insert into @ESCRITURA
(codigo)
values
('1')
,('2')
,('3')

insert into @ESCRITURAPESSOA
(codesc, codpessoa)
values
('1','abc')
,('2','def')
,('3','ghi')
,('1','jkl')
,('2','mno')
,('3','pqr')
,('1','stu')

select codesc, codpessoa1, codpessoa2,codpessoa3 from
(select
'CodPessoa' + convert(varchar,ROW_NUMBER() over (partition by codesc order by codpessoa)) as rw
, codesc
, codpessoa
from
@ESCRITURAPESSOA) as res
pivot
(
max(codpessoa)
for
rw in (codpessoa1, codpessoa2, codpessoa3)
) as pivotPessoa
GOSTEI 0
Deivison Melo

Deivison Melo

09/08/2013

Boa tarde,

Além dos join você também pode utilizar union (union all) e depois agrupar as informações.

Dá uma olhada também nos link´s abaixo:

https://www.devmedia.com.br/10-dicas-para-classificar-agrupar-e-sumarizar-dados-em-sql/27555

http://social.msdn.microsoft.com/Forums/sqlserver/pt-BR/05f5f945-c240-4ec9-9a55-1d34448b8d5f/duvida-agrupar-informaoes
GOSTEI 0
Luis Flores

Luis Flores

09/08/2013

Daniel Luiz
Obrigado pela ajuda, mas na verdade uma escritura pode não ter apenas 3 pessoas esse número é bem relativo
mas sería quase isso.
GOSTEI 0
Ignez Mello

Ignez Mello

09/08/2013

Oi Luiz,

Eu desenvolvi um código para atender um problema bem semelhante ao seu. Tive que apelas para variáveis, porque o assunto em foco (vendedores por loja) variava quase diariamente. :-p

Eu aproveitei o código acima, e fiz alguns ajustes para adaptá-lo ao meu código. Também acrescentei mais algumas pessoas por contrato. Faça um teste, variando o conteúdo da tabela #EscrituraPessoa, e veja se atende sua necessidade.



DROP TABLE #ESCRITURA
DROP TABLE #ESCRITURAPESSOA

CREATE TABLE #ESCRITURA (codigo varchar(20), #ESCRITURA varchar(20))
CREATE TABLE #ESCRITURAPESSOA (codesc varchar(20), codpessoa varchar(20))

DECLARE @Conta TINYINT = 1 ,
@Colunas NVARCHAR(150) = '',
@Query NVARCHAR(500)

insert into #ESCRITURA (codigo)
values ('1'),('2'),('3')

insert into #ESCRITURAPESSOA (codesc, codpessoa)
values
('1','abc')
,('3','ghi')
,('1','jkl')
,('2','mno')
,('3','pqr')
,('1','stu')
,('1','xyz')
,('2','abc')
,('3','def')
,('1','ghi')
,('2','jkl')
,('3','mno')
,('1','pqr')
,('2','stu')
,('2','xyz')
,('1','aaa')
,('1','bbb')

WHILE (select TOP 1 COUNT(1) from #ESCRITURAPESSOA group by codesc order by 1 desc) >= @Conta
BEGIN
SET @Colunas = @Colunas + ', codpessoa' + CAST(@Conta AS VARCHAR(3))
SET @Conta += 1
END

SET @Query = N'select codesc' + @Colunas + ' from
(select
''CodPessoa'' + convert(varchar,ROW_NUMBER() over (partition by codesc order by codpessoa)) as rw
, codesc
, codpessoa
from
#ESCRITURAPESSOA) as res
pivot
(
max(codpessoa)
for
rw in (' + STUFF(@Colunas,1,1,'') + ')
) as pivotPessoa'

EXECUTE(@Query)
go


/*
USE SIP_ANALISE
GO

DECLARE @cols NVARCHAR(max)
SELECT @cols = STUFF(( SELECT DISTINCT '],[' + t2.TipoPosto
FROM Ctritens AS t2
WHERE t2.TipoPosto IS NOT NULL AND t2.TipoPosto <> ''
ORDER BY '],[' + t2.TipoPosto
FOR XML PATH('')), 1, 2, '') + ']'
DECLARE @cols1 NVARCHAR(max)
SELECT @cols1 = STUFF(( SELECT DISTINCT
', COALESCE([' + t2.TipoPosto + '], 0) AS TipoPosto_' + t2.TipoPosto
FROM Ctritens AS t2
WHERE t2.TipoPosto IS NOT NULL AND t2.TipoPosto <> ''
ORDER BY 1
FOR XML PATH('')), 1, 2, '')-- + '], 0)'

print @cols
print @cols1

DECLARE @Query NVARCHAR(4000)
SET @Query = N'SELECT TOP 100 contrato, '+ @cols1+ ' FROM (
SELECT
tipoPosto,
COALESCE(ValorEve, 0) as ValorEve,
contrato
FROM
CtrItens
) sub
PIVOT
(
MAX(ValorEve)
for tipoPosto
IN ( ' + @cols +' )) as PTable;'

PRINT @Cols
PRINT @Cols1
PRINT @Query

EXECUTE(@Query)
go


Abraços,

Ignez
GOSTEI 0
Ignez Mello

Ignez Mello

09/08/2013

Luis,

Por favor considere apenas até antes do "USE". Desse ponto até o final foi lixo que eu copiei sem querer e não encontrei uma opção para alterar o post e corrigi-lo.

Ignez
GOSTEI 0
Ignez Mello

Ignez Mello

09/08/2013

Oi Luiz,

Eu desenvolvi um código para atender um problema bem semelhante ao seu. Tive que apelas para variáveis, porque o assunto em foco (vendedores por loja) variava quase diariamente. :-p

Eu aproveitei o código acima, e fiz alguns ajustes para adaptá-lo ao meu código. Também acrescentei mais algumas pessoas por contrato. Faça um teste, variando o conteúdo da tabela #EscrituraPessoa, e veja se atende sua necessidade.



DROP TABLE #ESCRITURA
DROP TABLE #ESCRITURAPESSOA

CREATE TABLE #ESCRITURA (codigo varchar(20), #ESCRITURA varchar(20))
CREATE TABLE #ESCRITURAPESSOA (codesc varchar(20), codpessoa varchar(20))

DECLARE @Conta TINYINT = 1 ,
@Colunas NVARCHAR(150) = '',
@Query NVARCHAR(500)

insert into #ESCRITURA (codigo)
values ('1'),('2'),('3')

insert into #ESCRITURAPESSOA (codesc, codpessoa)
values
('1','abc')
,('3','ghi')
,('1','jkl')
,('2','mno')
,('3','pqr')
,('1','stu')
,('1','xyz')
,('2','abc')
,('3','def')
,('1','ghi')
,('2','jkl')
,('3','mno')
,('1','pqr')
,('2','stu')
,('2','xyz')
,('1','aaa')
,('1','bbb')

WHILE (select TOP 1 COUNT(1) from #ESCRITURAPESSOA group by codesc order by 1 desc) >= @Conta
BEGIN
SET @Colunas = @Colunas + ', codpessoa' + CAST(@Conta AS VARCHAR(3))
SET @Conta += 1
END

SET @Query = N'select codesc' + @Colunas + ' from
(select
''CodPessoa'' + convert(varchar,ROW_NUMBER() over (partition by codesc order by codpessoa)) as rw
, codesc
, codpessoa
from
#ESCRITURAPESSOA) as res
pivot
(
max(codpessoa)
for
rw in (' + STUFF(@Colunas,1,1,'') + ')
) as pivotPessoa'

EXECUTE(@Query)
go

Abraços,

Ignez
GOSTEI 0
POSTAR