none
Unir o resultado de uma query na mesma linha a partir do sequencial RRS feed

  • 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.
    quinta-feira, 19 de janeiro de 2017 10:15

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

    quinta-feira, 19 de janeiro de 2017 12:23
  • Deleted
    quinta-feira, 19 de janeiro de 2017 12:35
  • Fica dando esse erro:

    Mensagem 102, Nível 15, Estado 1, Linha 17
    Incorrect syntax near '('.

    Nessa linha:

    FROM    DadosPivot PIVOT ( MAX(DATA_HORA) FOR SEQUENCIAL IN ( [1], [2],[3], [4] ) ) P;

    quinta-feira, 19 de janeiro de 2017 12:36
  • 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

    quinta-feira, 19 de janeiro de 2017 12:41
  • 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

    quinta-feira, 19 de janeiro de 2017 12:52
  • 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.

    quinta-feira, 19 de janeiro de 2017 12:53
  • No seu retornou isso: [1],[2],[3],[4]
    quinta-feira, 19 de janeiro de 2017 12:56
  • 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
    quinta-feira, 19 de janeiro de 2017 12:59
  • Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64)   Mar 29 2009 10:11:52   Copyright (c) 1988-2008 Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (VM) 
    quinta-feira, 19 de janeiro de 2017 13:04
  • Deleted
    quinta-feira, 19 de janeiro de 2017 13:15
  • Deleted
    quinta-feira, 19 de janeiro de 2017 13:19
  • RETORNA ISSO: [1],[2],[3],[4]

    E DA ESSE ERRO:

    Mensagem 102, Nível 15, Estado 1, Linha 13 Incorrect syntax near '('.    

    LINHA 13 = DECLARE @query NVARCHAR(MAX)

    quinta-feira, 19 de janeiro de 2017 13:21
  • 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

    Niveis de compatibilidade


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    quinta-feira, 19 de janeiro de 2017 13:22
  • 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.

    quinta-feira, 19 de janeiro de 2017 13:24
  • 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
    quinta-feira, 19 de janeiro de 2017 13:31
  • Deleted
    quinta-feira, 19 de janeiro de 2017 13:57
  • Deleted
    • Marcado como Resposta otaciojb quinta-feira, 19 de janeiro de 2017 15:30
    quinta-feira, 19 de janeiro de 2017 14:32
  • Esse
    -- código #2
     deu certo,muito obrigado ! 
    quinta-feira, 19 de janeiro de 2017 15:30