terça-feira, 25 de novembro de 2014

Como fazer para concatenar mais de um campo no PIVOT

Depois de trabalhar com PIVOT, me deparei com outro problema: concatenar mais de um campo dentro do PIVOT.

No forum abaixo tem a pergunta e algumas soluções propostas:

http://stackoverflow.com/questions/27108762/pivot-sql-server-multiple-values-in-aggregate-function

Minha solução ficou da seguinte forma:


select * FROM

(select s.IdSKU, ca.Campo, [Valor] = Case when ca.Campo = 'cor' then REPLACE((Select distinct Valor AS [data()] from Colecao (NOLOCK) cl            
  INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cl.IdColecao            
  INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro            
  INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto            
  INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria            
  INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria            
  INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto    
  INNER JOIN SkuValorCampo (NOLOCK) svc ON svc.idSku = s.IdSKU        
  INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = svc.idValorCampo
  INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
  INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo
  where s.IdSKU = 309613 and ca.Campo = 'cor' FOR xml path('')),' ',',') else v.Valor end
 FROM Colecao (NOLOCK) cli            
  INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cli.IdColecao            
  INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro            
  INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto            
  INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria            
  INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria            
  INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto    
  INNER JOIN SkuValorCampo (NOLOCK) svc ON svc.idSku = s.IdSKU        
  INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = svc.idValorCampo
  INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
  INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo
  where s.IdSKU = 309613
 
  UNION
 
  select s.IdSKU, ca.Campo, v.Valor
 FROM Colecao (NOLOCK) cl            
  INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cl.IdColecao            
  INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro            
  INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto            
  INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria            
  INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria            
  INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto  
  INNER JOIN ProdutoValorCampo (NOLOCK) pvc ON pvc.idProduto = p.IdProduto
  INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = pvc.idValorCampo
  INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
  INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo  
 
  where s.IdSKU = 309613) AS t
 PIVOT
 (MAX(Valor)

 FOR Campo IN (Tamanho,Cor,Gênero)) tt

Muito Obrigado e até o próximo post!

Nenhum comentário:

Postar um comentário