Dados em uma unica linha
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 ?
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
Curtidas 0
Respostas
Carlos Natividade
03/04/2018
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
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
GOSTEI 0
Chromusmaster
03/04/2018
Esta função é apenas a partir do SQL 2017, possuimos o SQL 2008 no banco oficial. Há alguma outra sugestão ?
Att. Nathann Lucas
Att. Nathann Lucas
GOSTEI 0
Jerson Boer
03/04/2018
Olá Nathann, já pesquisou sobre "XML FOR RAW", basicamente ele pega os valores e transforma em concatenações em 1 célula.
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.
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.
GOSTEI 0