none
CTE sem a necessidade de utilizar o pivot RRS feed

  • Pergunta

  • Pessoal

         Existiria alguma maneira de fazer o script abaixo utilizando somente cte sem a necessidade do pivot, mais seguindo o conceito do cte da estrutura abaixo ?

    with cte_pivot
    		as
    		(
    	
    		SELECT DISTINCT id_tel,[1] TEL1,[2] TEL2,[3] TEL3,[4] TEL4,[5] TEL5,[6] TEL6,[7] TEL7,[8] TEL8,[9] TEL9,[10] TEL10
    		  , [11] TEL11, [12] TEL12, [13] TEL13, [14] TEL14, [15] TEL15, [16] TEL16, [17] TEL17, [18] TEL18, [19] TEL19,[20] TEL20
    		FROM #CONTAGEM
    		PIVOT (MAX(TEL) FOR CONTAGEM IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20])) tb_Pivot
    		)
    		select 
    		*
    		into #tmp_cte_pivot
    		from cte_pivot

    sexta-feira, 8 de novembro de 2019 21:23

Respostas

  • Existiria alguma maneira de fazer o script abaixo utilizando somente cte sem a necessidade do pivot, mais seguindo o conceito do cte da estrutura abaixo ?

    O que você necessita é que o seu código funcione em versão do SQL Server mais antiga, que não tenha operador PIVOT? Se for este o caso é possível utilizar o pivô clássico, conforme detalhado no artigo “Alas & Pivôs”:

    -- código #1
    with cte_pivot as ( SELECT id_tel, max (case when CONTAGEM = 1 then TEL end] as TEL1, max (case when CONTAGEM = 2 then TEL end] as TEL2, ... max (case when CONTAGEM = 20 then TEL end] as TEL20 from #CONTAGEM
    group by id_tel ) SELECT * into #tmp_cte_pivot from cte_pivot;

    Não testei; pode conter erro(s).

    ---

    Se não for isso, pode explicar qual é o objetivo da CTE? Isto é, o que contém a tabela #CONTAGEM e qual o resultado que deve ser obtido.

     


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz sexta-feira, 8 de novembro de 2019 22:42
    • Sugerido como Resposta Junior Galvão - MVPMVP domingo, 17 de novembro de 2019 16:18
    • Marcado como Resposta neibala segunda-feira, 18 de novembro de 2019 18:46
    sexta-feira, 8 de novembro de 2019 22:04

Todas as Respostas

  • Existiria alguma maneira de fazer o script abaixo utilizando somente cte sem a necessidade do pivot, mais seguindo o conceito do cte da estrutura abaixo ?

    O que você necessita é que o seu código funcione em versão do SQL Server mais antiga, que não tenha operador PIVOT? Se for este o caso é possível utilizar o pivô clássico, conforme detalhado no artigo “Alas & Pivôs”:

    -- código #1
    with cte_pivot as ( SELECT id_tel, max (case when CONTAGEM = 1 then TEL end] as TEL1, max (case when CONTAGEM = 2 then TEL end] as TEL2, ... max (case when CONTAGEM = 20 then TEL end] as TEL20 from #CONTAGEM
    group by id_tel ) SELECT * into #tmp_cte_pivot from cte_pivot;

    Não testei; pode conter erro(s).

    ---

    Se não for isso, pode explicar qual é o objetivo da CTE? Isto é, o que contém a tabela #CONTAGEM e qual o resultado que deve ser obtido.

     


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz sexta-feira, 8 de novembro de 2019 22:42
    • Sugerido como Resposta Junior Galvão - MVPMVP domingo, 17 de novembro de 2019 16:18
    • Marcado como Resposta neibala segunda-feira, 18 de novembro de 2019 18:46
    sexta-feira, 8 de novembro de 2019 22:04
  •  José Diz

          O solução seria está mesmo, só que estava pensando que pude-se ter algo ligado ao cte que por algum meio eu consegui-se fazer algo ligado a recursividade dentro do cte ou algo próximo de gerar um select com o conceito de hierarquia  isto dentro do cte, então no caso de pivot realmente não teria, correto ?

    quarta-feira, 13 de novembro de 2019 19:15
  • Além do operador PIVOT e do pivô clássico, é possível obter o mesmo resultado de outras formas, mas cada vez mais complexas e provavelmente mais ineficientes.

    Para cada valor de id_tel existem 20 linhas, uma para cada valor de CONTAGEM? Explique o que contém a tabela #CONTAGEM, para que seja possível postar outras opções.



    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz quarta-feira, 13 de novembro de 2019 20:40
    quarta-feira, 13 de novembro de 2019 20:30
  • José Diz

         O na tabela #contagem, contém o id do Cliente ( id_tel ), id sequenciador de cada telefone do Cliente ( CONTAGEM ), onde por este id consigo identificar a quantidade de telefone que o Cliente tem e o numero do telefone do Cliente ( TEL ), veja se com essas informações ajuda a deixar um pouco mais claro a meu problema no momento ?

    segunda-feira, 18 de novembro de 2019 12:42
  • (...) tabela #contagem contém o id do Cliente ( id_tel ), id sequenciador de cada telefone do Cliente ( CONTAGEM ), onde por este id consigo identificar a quantidade de telefone que o Cliente tem e o numero do telefone do Cliente ( TEL )

    Considerando-se as informações anteriores e a atual, e se o objetivo é listar os telefones de cada cliente em uma única linha, acho que a forma mais eficiente é o pivotamento, seja através do operador PIVOT ou do pivô clássico.

    O cliente pode ter no máximo 20 telefones? Se a quantidade máxima de telefones por cliente é desconhecida, pode-se utilizar pivotamento com comando SQL dinâmico, obtendo-se previamente qual é o maior valor de "contagem" encontrado.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    segunda-feira, 18 de novembro de 2019 13:08
  • José Diz

           Eu estava preocupado se pude de alguma maneira ter através dos diversos recursos do cte, ter uma maneira de executar o pivotamento de forma clássica, isto utilizando ainda mais os recursos do cte, como de momento a foma do cte me atendeu as minhas expectativas no momento, então quero agradecer a sua atenção neste assunto.

    segunda-feira, 18 de novembro de 2019 18:46
  • Ok.    
    • Editado José Diz segunda-feira, 18 de novembro de 2019 19:12
    segunda-feira, 18 de novembro de 2019 19:12