none
É Possível criar uma tabela dinâmica a partir de um result set RRS feed

  • Pergunta

  • Olá pessoal, 

    Preciso de um help em que preciso armazenar dados de um result set que é resultado de um PIVOT dinâmico, conforme o exemplo abaixo:

                            

    DECLARE @query VARCHAR(MAX)

    -- Doing Dinamic Column
    SET@query=''
    SELECT@query=@query+'['+[a].[Column]+'], '
      FROM
        (SELECT DISTINCT 
    CONVERT(VARCHAR(2),
    NomeTamanho) AS [Column]
         FROM Tamanhos
        )AS a
    SET @query = LEFT(@query,len(@query)-1)

    -- Doing query final with PIVOT
    SET @query ='SELECT 
    Descricao, 
    CodProduto,  '
    +@query
      +' FROM (SELECT P.Descricao, P.CodProduto, T.NomeTamanho,   SUM(IP.Quant) QTDETOTAL  '+
       '         FROM Produtos P, GradeProdutos GP, Tamanhos T, ItensPedidos IP '+
         ' WHERE P.CodProduto = GP.CodProduto '+
         '   AND P.CodProduto = IP.CodProduto '+
                 '   AND GP.CodTamanho = T.CodTamanho '+
                         '   AND IP.CodTamanho = T.CodTamanho '+
                         '   AND SUBSTRING(P.CodProduto, 1,2 ) = ''CL'' '+
                         '   AND SUBSTRING(P.CodProduto, 5,3 ) = ''053'' '+
                         '   AND YEAR(P.DATA) >= 2012 '+      
         ' GROUP BY P.CodProduto, P.Descricao, T.NomeTamanho '+') sq 
                           PIVOT (SUM(QTDETOTAL) FOR NomeTamanho IN('+@query+')) AS pt'

    EXEC (@query)

    Preciso armazenar os dados retornados de EXEC (@query) em uma tabela para juntar a outros dados depois. 

    sábado, 7 de julho de 2018 19:07

Respostas

Todas as Respostas

  • Deleted
    domingo, 8 de julho de 2018 10:08
  • É possível utilizar o SELECT INTO no seu SELECT porém todas as colunas devem estar com um alias.

    Segue o exemplo de como ficaria o seu código:

    DECLARE @query
    VARCHAR(MAX)
    
    -- Doing Dinamic Column
    SET@query=''
    SELECT@query=@query+'['+[a].[Column]+'], '
      FROM
        (SELECT DISTINCT 
    CONVERT(VARCHAR(2),
    NomeTamanho) AS [Column]
         FROM Tamanhos
        )AS a
    SET @query = LEFT(@query,len(@query)-1)
    
    -- Doing query final with PIVOT
    SET @query ='SELECT 
    Descricao, 
    CodProduto,  '
    +@query
    + ' INTO dbo.SuaTabela ' --//aqui coloca-se o nome da tabela a ser gerada a partir deste select
      +' FROM (SELECT P.Descricao, P.CodProduto, T.NomeTamanho,   SUM(IP.Quant) QTDETOTAL  '+
       '         FROM Produtos P, GradeProdutos GP, Tamanhos T, ItensPedidos IP '+
         ' WHERE P.CodProduto = GP.CodProduto '+
         '   AND P.CodProduto = IP.CodProduto '+
                 '   AND GP.CodTamanho = T.CodTamanho '+
                         '   AND IP.CodTamanho = T.CodTamanho '+
                         '   AND SUBSTRING(P.CodProduto, 1,2 ) = ''CL'' '+
                         '   AND SUBSTRING(P.CodProduto, 5,3 ) = ''053'' '+
                         '   AND YEAR(P.DATA) >= 2012 '+      
         ' GROUP BY P.CodProduto, P.Descricao, T.NomeTamanho '+') sq 
                           PIVOT (SUM(QTDETOTAL) FOR NomeTamanho IN('+@query+')) AS pt'
    
    EXEC (@query)
    Uma observação válida é que a tabela não pode existir na base.
    domingo, 8 de julho de 2018 15:16
  • Deleted
    segunda-feira, 9 de julho de 2018 09:47
  • Adrian,

    Obrigado pelo retorno, dessa forma consigo criar a tabela temporária porém somente durante a sessão. Se tentar acessar os dados após o EXEC a tabela já não está mais acessível, por exemplo para tabela = teste:

    EXEC (@query)

    SELECT * FROM #teste

    Como preciso pegar esses dados dessa temp #teste para juntar com outros dados preciso acessá-la fora da sessão. Tem alguma idéia de como fazer isso? Tentei de várias formas aqui e não consegui.

    Obrigado

    Abraço,

    quarta-feira, 11 de julho de 2018 19:28
  • Deleted
    • Marcado como Resposta Pereir0 quinta-feira, 12 de julho de 2018 17:24
    quarta-feira, 11 de julho de 2018 21:23
  • Como o José Diz mencionou não é necessário que a tabela seja temporário no INSERT INTO, tudo irá depender de como vc quer criar a tabela, por exemplo se eu utilizar o comando:

    SELECT 'a' AS col

    INTO dbo.teste

    Eu estou criando uma tabela física na base com os dados do SELECT. Caso eu queira criar uma tabela temporária eu devo colocar o "#":

    SELECT 'a' AS col

    INTO #teste

    Fazendo com que seja criado uma tabela temporária duradoura somente até o fim da sessão.

    quarta-feira, 11 de julho de 2018 21:40
  • Diniz obrigado pelo retorno, funcionou perfeito !!!

    Abraço,

    Antonio

    quinta-feira, 12 de julho de 2018 17:24
  • Deleted
    quinta-feira, 12 de julho de 2018 18:34