Usuário com melhor resposta
Unir o resultado de uma query na mesma linha a partir do sequencial

Pergunta
-
Tenho a seguinte consulta:
SELECT * FROM SERQUENCIAL WHERE DATA BETWEEN '2017-01-01' AND '2017-01-19'
Ela retorna:
ID_PESS NOME DATA DATA_HORA SEQUENCIAL 8788 JOAO 2017-01-01 2017-01-01 13:01:01 1 8788 JOAO 2017-01-01 2017-01-01 15:07:01 2 8788 JOAO 2017-01-01 2017-01-01 17:08:01 3 8788 JOAO 2017-01-01 2017-01-01 19:03:01 4 8533 MARIA 2017-01-03 2017-01-03 11:01:01 1 8533 MARIA 2017-01-03 2017-01-03 14:07:01 2 8533 MARIA 2017-01-03 2017-01-03 16:08:01 3 8533 MARIA 2017-01-03 2017-01-03 18:03:01 4 8935 JOSE 2017-01-05 2017-01-05 13:01:01 1 8935 JOSE 2017-01-05 2017-01-05 19:07:01 2 8935 JOSE 2017-01-05 2017-01-05 20:08:01 3 8935 JOSE 2017-01-05 2017-01-05 22:03:01 4 8935 JOSE 2017-01-05 2017-01-05 23:03:01 5
Como faco para unir os retornos por pessoa da seguinte forma por exemplo:
ID_PESS NOME DATA DATA_HORA_01 SEQ1 DATA_HORA_02 SEQ2 DATA_HORA_03 SEQ3 DATA_HORA_04 SEQ4 8788 JOAO 2017-01-01 2017-01-01 13:01:01 1 2017-01-01 15:07:01 2 2017-01-01 17:08:01 3 2017-01-01 19:03:01 4
Ou seja os dados da pessoa juntos na mesma linha.
Observação:
Os dados da pessoa podem se repetir em outro dia,caso aconteça será
uma nova linha da pessoa.
Respostas
Todas as Respostas
-
Algo semelhante a isso te ajuda ?
DECLARE @Table TABLE ( ID_PESS INT , NOME VARCHAR(30) , DATA DATE , DATA_HORA DATETIME , SEQUENCIAL INT ); INSERT INTO @Table ( ID_PESS, NOME, DATA, DATA_HORA, SEQUENCIAL ) VALUES ( 8788, 'JOAO', '2017-01-01', '2017-01-01 13:01:01', 1 ), ( 8788, 'JOAO', '2017-01-01', '2017-01-01 15:07:01', 2 ), ( 8788, 'JOAO', '2017-01-01', '2017-01-01 17:08:01', 3 ), ( 8788, 'JOAO', '2017-01-01', '2017-01-01 19:03:01', 4 ), ( 8788, 'JOAO', '2017-01-02', '2017-01-02 19:03:01', 1 ), ( 8533, 'MARIA', '2017-01-03', '2017-01-03 11:01:01', 1 ), ( 8533, 'MARIA', '2017-01-03', '2017-01-03 14:07:01', 2 ), ( 8533, 'MARIA', '2017-01-03', '2017-01-03 16:08:01', 3 ); --ID_PESS NOME DATA DATA_HORA_01 SEQ1 DATA_HORA_02 SEQ2 DATA_HORA_03 SEQ3 DATA_HORA_04 SEQ4 -- 8788 JOAO 2017-01-01 2017-01-01 13:01:01 1 2017-01-01 15:07:01 2 2017-01-01 17:08:01 3 2017-01-01 19:03:01 4 WITH DadosPivot AS ( SELECT T.ID_PESS , T.NOME , T.DATA , T.DATA_HORA , T.SEQUENCIAL FROM @Table T WHERE T.ID_PESS = '8788' ) -- SELECT * FROM @Table T SELECT P.ID_PESS , P.NOME , P.DATA , [DATA_HORA_01] = [1] , [DATA_HORA_02] = [2] , [DATA_HORA_02] = [3] , [DATA_HORA_04] = [4] FROM DadosPivot PIVOT ( MAX(DATA_HORA) FOR SEQUENCIAL IN ( [1], [2], [3], [4] ) ) P;
Wesley Neves
-
-
-
Bom dia Otacio,
Segue uma forma de montar via Pivot dinâmico.
Veja se lhe atende.
Abraço!
CREATE TABLE #TEMP ( ID_PESS VARCHAR(4), NOME VARCHAR(10), DATA DATE, DATA_HORA DATETIME, SEQUENCIAL INT ) INSERT INTO #TEMP VALUES ('8788','JOAO ','2017-01-01','2017-01-01 13:01:01',1), ('8788','JOAO ','2017-01-01','2017-01-01 15:07:01',2), ('8788','JOAO ','2017-01-01','2017-01-01 17:08:01',3), ('8788','JOAO ','2017-01-01','2017-01-01 19:03:01',4), ('8533','MARIA ','2017-01-03','2017-01-03 11:01:01',1), ('8533','MARIA ','2017-01-03','2017-01-03 14:07:01',2), ('8533','MARIA ','2017-01-03','2017-01-03 16:08:01',3), ('8533','MARIA ','2017-01-03','2017-01-03 18:03:01',4), ('8935','JOSE ','2017-01-05','2017-01-05 13:01:01',1), ('8935','JOSE ','2017-01-05','2017-01-05 19:07:01',2), ('8935','JOSE ','2017-01-05','2017-01-05 20:08:01',3), ('8935','JOSE ','2017-01-05','2017-01-05 22:03:01',4), ('8935','JOSE ','2017-01-05','2017-01-05 23:03:01',5) DECLARE @SQLStr VARCHAR(5000) SET @SQLStr='' SELECT @SQLStr=@SQLStr+'['+[a].[Column]+'], ' FROM (SELECT DISTINCT CONVERT(VARCHAR(2),SEQUENCIAL)as[Column] FROM #TEMP )as a SET @SQLStr=LEFT(@SQLStr,len(@SQLStr)-1) SET @SQLStr='SELECT ID_PESS, NOME, DATA, ' +@SQLStr +' FROM (SELECT ID_PESS, NOME, DATA, DATA_HORA, SEQUENCIAL FROM #TEMP WHERE DATA BETWEEN ''2017-01-01'' AND ''2017-01-19'' GROUP BY ID_PESS, NOME, DATA, DATA_HORA, SEQUENCIAL '+ ' ) sq PIVOT (MAX(DATA_HORA) FOR SEQUENCIAL IN(' +@SQLStr+')) AS pt' PRINT @SQLStr EXEC(@SQLStr) DROP TABLE #TEMP
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
-
Realmente o José tem razão como as colunas podem crescer um cursor dinamico seria melhor,
segue um exemplo simples.
CREATE TABLE #TableDemostracao ( ID_PESS INT , NOME VARCHAR(30) , DATA DATE , DATA_HORA DATETIME , SEQUENCIAL INT ); INSERT INTO #TableDemostracao ( ID_PESS, NOME, DATA, DATA_HORA, SEQUENCIAL ) VALUES ( 8788, 'JOAO', '2017-01-01', '2017-01-01 13:01:01', 1 ), ( 8788, 'JOAO', '2017-01-01', '2017-01-01 15:07:01', 2 ), ( 8788, 'JOAO', '2017-01-01', '2017-01-01 17:08:01', 3 ), ( 8788, 'JOAO', '2017-01-01', '2017-01-01 19:03:01', 4 ), ( 8788, 'JOAO', '2017-01-02', '2017-01-02 19:03:01', 1 ), ( 8533, 'MARIA', '2017-01-03', '2017-01-03 11:01:01', 1 ), ( 8533, 'MARIA', '2017-01-03', '2017-01-03 14:07:01', 2 ), ( 8533, 'MARIA', '2017-01-03', '2017-01-03 16:08:01', 3 ); DECLARE @cols NVARCHAR (MAX) SELECT @cols = COALESCE (@cols + ',[' + CAST([SEQUENCIAL] AS VARCHAR(10)) + ']', '[' + CAST([SEQUENCIAL] AS VARCHAR(10)) + ']') FROM (SELECT DISTINCT [SEQUENCIAL] FROM #TableDemostracao) PV ORDER BY [SEQUENCIAL] SELECT @cols DECLARE @query NVARCHAR(MAX) SET @query = ' WITH DadosPivot AS ( SELECT T.ID_PESS , T.NOME , T.DATA , T.DATA_HORA , T.SEQUENCIAL FROM #TableDemostracao T ) SELECT * FROM DadosPivot PIVOT ( MAX(DATA_HORA) FOR SEQUENCIAL IN ( '+@cols+') ) P'; EXEC(@query);
Wesley Neves
-
Deu erro também, esta retornando esse erro:
(13 linha(s) afetadas)SELECT ID_PESS, NOME, DATA, [1], [2], [3], [4], [5] FROM (SELECT ID_PESS, NOME, DATA, DATA_HORA, SEQUENCIAL FROM #TEMP WHERE DATA BETWEEN '2017-01-01' AND '2017-01-19'GROUP BY ID_PESS, NOME, DATA, DATA_HORA, SEQUENCIAL ) sq PIVOT (MAX(DATA_HORA) FOR SEQUENCIAL IN([1], [2], [3], [4], [5])) AS ptMensagem 325, Nível 15, Estado 1, Linha 2Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the SET COMPATIBILITY_LEVEL option of ALTER DATABASE.
-
-
qual e a versão do seu SQL Server ??
SELECT @@VERSION
Wesley Neves
Outra coisa copiei seu codigo e sua sintaxe está errado
nesse trecho
SEQUENCIAL IN([1], [2], [3], [4], [5]))
tem que ter um alias ão PIVOT
SEQUENCIAL IN ( [1], [2], [3], [4],[5] ) ) P;
- Editado Wesley Neves quinta-feira, 19 de janeiro de 2017 13:04 adição
-
-
-
-
-
Cara,
Essa mensagem é apresentada quando existe algum erro de compatibilidade no seu BD.
Qual a versão do SQL que você está utilizando?
Tente utilizar esse comando para ajustar seu nivel de compatibilidade e depois execute a query novamente
ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = 110
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
-
Mesmo fazendo: -- PRINT @SQLStr
Retorna:
Mensagem 325, Nível 15, Estado 1, Linha 2
Incorrect syntax near 'PIVOT'. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the SET COMPATIBILITY_LEVEL option of ALTER DATABASE. -
Vc se atentou a mensagem
Outra coisa copiei seu código e sua sintaxe está errado
nesse trecho
SEQUENCIAL IN([1], [2], [3], [4], [5]))
tem que ter um alias ão PIVOT
SEQUENCIAL IN ( [1], [2], [3], [4],[5] ) ) P;
Acredito que há um erro de sintaxe na sua query e não de compatibilidade,
posta a query completa por favor.
Wesley Neves
- Editado Wesley Neves quinta-feira, 19 de janeiro de 2017 13:33 correção
-
-
-