Dados em uma unica linha

03/04/2018

0

Boa tarde tenho a seguinte consulta SELECT P.NOME AS [PROFESSOR],
STIPOCURSO.NOME AS [NÍVEL DE ENSINO],
SPL.CODPERLET AS [ANO],
STURMA.NOME AS [TURMA],
STURNO.NOME AS [TURNO],
SD.NOME AS [DISCIPLINA],
SPT.AULASSEMANAISPROF AS [AULAS SEMANAIS]
FROM SPROFESSOR SP (NOLOCK)
INNER JOIN PPESSOA P On P.CODIGO=SP.CODPESSOA
INNER JOIN SPROFESSORTURMA SPT (NOLOCK)
ON SP.CODCOLIGADA = SPT.CODCOLIGADA
AND SP.CODPROF = SPT.CODPROF
INNER JOIN STURMADISC ST (NOLOCK)
ON SPT.CODCOLIGADA = ST.CODCOLIGADA
AND SPT.IDTURMADISC = ST.IDTURMADISC
INNER JOIN SPLETIVO SPL (NOLOCK)
ON ST.IDPERLET = SPL.IDPERLET
AND ST.CODCOLIGADA = SPL.CODCOLIGADA
INNER JOIN STURNO (NOLOCK)
ON ST.CODCOLIGADA = STURNO.CODCOLIGADA
AND ST.CODTURNO = STURNO.CODTURNO
INNER JOIN SDISCIPLINA SD (NOLOCK)
ON ST.CODCOLIGADA = SD.CODCOLIGADA
AND ST.CODDISC = SD.CODDISC
INNER JOIN STIPOCURSO (NOLOCK)
ON SD.CODTIPOCURSO = STIPOCURSO.CODTIPOCURSO
AND SD.CODCOLIGADA = STIPOCURSO.CODCOLIGADA
INNER JOIN STURMA (NOLOCK)
ON ST.CODTURMA = STURMA.CODTURMA
AND SPL.IDPERLET = STURMA.IDPERLET
WHERE STURMA.IDPERLET = 109
AND STURMA.CODTURMA = '3ª Série JA'
GROUP BY
P.NOME,
STIPOCURSO.NOME,
SPL.CODPERLET,
STURMA.NOME,
STURNO.NOME,
SPT.AULASSEMANAISPROF,
SD.NOME

Como posso fazer para trazer o nome dos dois professores da disciplina na mesma linha ?
Chromusmaster

Chromusmaster

Responder

Posts

05/04/2018

Carlos Natividade

Bom dia.
Podes utilizar a função STRING_AGG:
SELECT STRING_AGG (FirstName, CHAR(13)) AS csv
FROM Person.Person;
Dê uma olhada em: https://docs.microsoft.com/pt-br/sql/t-sql/functions/string-agg-transact-sql
Responder

05/04/2018

Chromusmaster

Esta função é apenas a partir do SQL 2017, possuimos o SQL 2008 no banco oficial. Há alguma outra sugestão ?

Att. Nathann Lucas
Responder

27/04/2018

Jerson Boer

Olá Nathann, já pesquisou sobre "XML FOR RAW", basicamente ele pega os valores e transforma em concatenações em 1 célula.

SELECT
	CodigoTipoFluxo AS 'Código', 
	TipoFluxo AS 'Tipo de Fluxo',
	
	LEFT(REPLACE(REPLACE((SELECT Etapas.Etapa as Campo
			FROM TipoFluxoEtapas INNER JOIN
				Etapas ON TipoFluxoEtapas.CodigoEtapa = Etapas.CodigoEtapa
			WHERE (TipoFluxoEtapas.CodigoTipoFluxo = TipoFluxo.CodigoTipoFluxo)
			ORDER BY TipoFluxoEtapas.Sequencia
		FOR XML RAW('A')), '<A Campo="', ''), '"/>', ', '),
		
		LEN(REPLACE(REPLACE((SELECT Etapas.Etapa as Campo
				FROM TipoFluxoEtapas INNER JOIN
					Etapas ON TipoFluxoEtapas.CodigoEtapa = Etapas.CodigoEtapa
				WHERE (TipoFluxoEtapas.CodigoTipoFluxo = TipoFluxo.CodigoTipoFluxo)
				ORDER BY TipoFluxoEtapas.Sequencia
			FOR XML RAW('A')), '<A Campo="', ''), '"/>', ', '))-1) AS 'Etapas do Fluxo'
			
FROM TipoFluxo
ORDER BY TipoFluxo


No exemplo acima, eu tenho uma tabela de Fluxo e em cada fluxo existem etapas. O uso do FOR XML me trás o nome das etapas em um mesmo campo.

Tente realizar a leitura do código e a adaptação à sua necessidade e qualquer coisa retorne e avaliamos novamente.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar