Uma equipa multinacional com mais de 20 anos de experiência especializada em serviços Web, Base de Dados, Cloud e Software de Gestão Empresarial por medida
  • Solução de negócio
    • Automação Robótica de Processos
    • Programas
    • Serviços de banco de dados
      • Relatórios
      • Integração de dados
    • Design de Websites
      • Design de logotipo
      • Gateways de pagamento
      • Localização e Tradução Web
      • Otimização de sites
      • Segurança do site
      • Ferramentas Técnicas
    • Serviços Empresariais
      • Amazon Web Services
      • Serviços do Google Cloud
      • Microsoft Azure
    • Microsoft Office
    • Mídia Social
  • Sobre
    • Carreiras
      • Tradutor Inglês-Espanhol
      • Tradutor Inglês-Turco
      • Tradutor Inglês-Japonês
      • Tradutor Inglês-Português
    • Equipe
      • Adrian Anandan
      • Ali Al Amine
      • Ayse Hur
      • Chester Copperpot
      • Gavin Clayton
      • Sai Gangu
      • Suneel Kumar
      • Surya Mukkamala
    • Portfolio
Deutsch (DE)English (EN-GB)English (EN-US)Español (ES)हिंदी (HI)italiano (IT)日本語 (JA)Português (PT)

SQL Server usando PIVOT com exemplo de SQL dinâmico

SQL Server usando uma função PIVOT complexa em um cenário do tipo mundo real, onde o número de colunas pode não ser sempre o mesmo.
Usando Picot com SQL Dinâmico

No último artigo, escrevi sobre o uso do PIVOT em um cenário padrão em que você conhece todas as colunas que deseja, usando os mesmos dados que agora podemos construir para produzir nomes de colunas dependentes do conjunto de dados real.

Vou pular a primeira parte desse artigo, mas fornecer o SQL para nos colocar em funcionamento aqui. Primeiro, vamos criar um conjunto de dados.

Mais: SQL Server usando exemplo PIVOT
CREATE TYPE c1bs_Piv AS TABLE(MyRow NVARCHAR(10),--Row IDMyCol NVARCHAR(10),--Value to become columnCalcCol INT--Value to be Summed)GODECLARE @Piv c1bs_PivINSERT INTO @PivSELECT '1','1',1 UNIONSELECT '1','s',1 UNIONSELECT '1','3',1 UNIONSELECT '2','2',6 UNIONSELECT '2','2',1 UNIONSELECT '2','3',1 UNIONSELECT '3','5',5 UNIONSELECT '3','2',1 UNIONSELECT '3','3',1 UNIONSELECT '3','3',3

No outro artigo, codificamos os nomes das colunas (1,2,3), no entanto, isso pode nem sempre ser viável, às vezes os conjuntos de registros podem precisar crescer quando, por exemplo, enviar um conjunto de dados para uma GUI, há um caminho em torno dele, vamos passar por ele passo a passo;

  • Crie um tipo de tabela para representar seus dados como acima.
  • Declare uma tabela e insira seus dados nela (@Piv)
  • Declare duas variáveis, uma para manter os nomes das colunas para Pivot e outra para a lista SELECT, neste exemplo, usando um ISNULL e os nomes das colunas eliminam quaisquer valores NULL. Também usamos COALESCE para concatenar os nomes em uma string.
  • Declare outra variável, com a tabela @Piv, são parâmetros que são passados posteriormente.
  • Declare nosso SQL, é aqui que injetamos os nomes das colunas e a lista de seleção em uma versão modificada do PIVOT simples.
  • EXECUTAR a instrução SQL acima e passar os parâmetros e a tabela @PIV.
--Complex Pivot - unknown column names--Get Column Names for belowDECLARE @Cols NVARCHAR(MAX),@Sel NVARCHAR(MAX) SELECT @Cols=COALESCE(@Cols+',','')+'['+MyCol+']',--Concatenate the Columns  @Sel =COALESCE(@Sel +',','')+'ISNULL(['+MyCol+'], 0) AS ['+MyCol+']' --Concatenate the Columns into a select listFROM @Piv GROUP BY MyCol 
--Columns list displaySELECT @Cols ColumnList,@Sel SelectList
--Complex Pivot SQLDECLARE @Params NVARCHAR(MAX)='@Piv c1bs_Piv READONLY'DECLARE @SQL NVARCHAR(MAX)='SELECT [MyRow],'+@Sel+'FROM @PivPIVOT (SUM(CalcCol)FOR MyColIN ('+@Cols+')) AS MyTable'
--Execute SQLEXECUTE sp_executesql @SQL,--SQL String from above@Params,--Parameter list@Piv--Temp Table needs to be passed in, can only be read only?

Nosso conjunto de dados agora cresceu para incluir duas colunas adicionais do conjunto de dados (5,s)

MyRow1235s
110101
207100
301450

Author

Was this helpful?

Please note, this commenting system is still in final testing.
Copyright Claytabase Ltd 2020

Registered in England and Wales 08985867

RSSLoginFale-ConoscoPolítica de CookiesSitemap

Social Media

facebook.com/Claytabaseinstagram.com/claytabase/twitter.com/Claytabaselinkedin.com/company/claytabase-ltd

Get in Touch

+442392064871info@claytabase.comClaytabase Ltd, Unit 3d, Rink Road Industrial Estate, PO33 2LT, United Kingdom
As configurações neste site são definidas para permitir todos os cookies. Estes podem ser alterados em nossa página de configurações e políticas de cookie. Ao continuar a usar este site, você concorda com o uso de cookies.
Ousia Logo
Logout
Ousia CMS Loader