Ir para conteúdo

Pivot SQL - Substituir Linhas por Colunas


Posts Recomendados


  • Tópicos Que Criei:  125
  • Tópicos/Dia:  0.02
  • Meu Conteúdo:  458
  • Conteúdo/Dia:  0.07
  • Reputação:   1
  • Pontos/Conquistas:  3.531
  • Conteúdo Resolvido:  0
  • Dias Ganho:  1
  • Status:  Offline
  • Idade:  44

Oi pessoal.

Tenho uma sentença SQL com a seguinte estrutura:

SELECT

SUBSTRING(FLAN.NUMERODOCUMENTO,1,6)

FROM FLAN(NOLOCK)

WHERE FLAN.CODCOLIGADA=1

AND FLAN.IDFAT=20

AND FLAN.NFOUDUP=1

Esta sentença retorna 10 registros (linhas). Como posso transformar cada linha em uma coluna?

Desde já sou grato pela colaboração.

Link para comentar
Compartilhar em outros sites


  • Tópicos Que Criei:  11
  • Tópicos/Dia:  0.00
  • Meu Conteúdo:  1.140
  • Conteúdo/Dia:  0.22
  • Reputação:   60
  • Pontos/Conquistas:  6.161
  • Conteúdo Resolvido:  0
  • Dias Ganho:  33
  • Status:  Offline
  • Idade:  42
  • Dispositivo:  Windows

Marcelo,

O CoporeRM usa compatibilidade 80 do SQL Server, o Pivot só funciona com compatibilidade 90 e o suporte da Totvs me disse que a compatibilidade 90 do SQL só poderá ser usado quando tudo estiver convertido para .NET.

[]'s

Link para comentar
Compartilhar em outros sites


  • Tópicos Que Criei:  125
  • Tópicos/Dia:  0.02
  • Meu Conteúdo:  458
  • Conteúdo/Dia:  0.07
  • Reputação:   1
  • Pontos/Conquistas:  3.531
  • Conteúdo Resolvido:  0
  • Dias Ganho:  1
  • Status:  Offline
  • Idade:  44

Blz companheiro. Valeu pela informação!

Link para comentar
Compartilhar em outros sites


  • Tópicos Que Criei:  11
  • Tópicos/Dia:  0.00
  • Meu Conteúdo:  186
  • Conteúdo/Dia:  0.03
  • Reputação:   0
  • Pontos/Conquistas:  1.035
  • Conteúdo Resolvido:  0
  • Dias Ganho:  0
  • Status:  Offline
  • Idade:  37

Oi pessoal.

Tenho uma sentença SQL com a seguinte estrutura:

SELECT

SUBSTRING(FLAN.NUMERODOCUMENTO,1,6)

FROM FLAN(NOLOCK)

WHERE FLAN.CODCOLIGADA=1

AND FLAN.IDFAT=20

AND FLAN.NFOUDUP=1

Esta sentença retorna 10 registros (linhas). Como posso transformar cada linha em uma coluna?

Desde já sou grato pela colaboração.

Oi Marcelo,

quando tenho essa necessidade normalmente declaro algumas variaveis e faço um subselect como vc pode ver abaixo um exemplo rapido

SELECT
		ANO,
		 CLIENTE,
		 VR1SEMESTRE = SUM(case when mes >=1 and mes < 7  then VALOR else 0 end),
		 VR2SEMESTRE = SUM(case when mes >=7 and mes <=12 then VALOR else 0 end)

		FROM

		(SELECT 
		cliente =c.nome ,
		 VALOR=f.valorbaixado ,
		 ANO=DATEPART(YEAR, F.DATABAIXA),
		 MES=DATEPART(MONTH, F.DATABAIXA)

		FROM  FLAN F, FCFO C

		WHERE 
		C.CODCFO = F.CODCFO		   
		AND F.CODCOLIGADA = C.CODCOLIGADA
		AND F.STATUSLAN=1 
		)Z
		WHERE VALOR >0
		GROUP BY cliente, ANO

Perceba que faço um case when e delimito o que vai aparecer nas colunas.....

Mas, pelo que você falou vc quer trazer em colunas, mas vc não sabe na verdade quais são os resultados da consulta para filtrar correto?

Sua necessidade pelo que pude assumir é que você precisa trazer em colunas para concatenar os resultados, correto?

você quer trazer todos os documentos de uma fatura específica não é?

Para isso você pode utilizar uma view com uma função que vai acumular os numeros dos documentos para você.

É isso mesmo? Se precisar de ajuda para montar me avise que dou um help....se eu entendi errado, explique para que nos possamos avaliar se existe outra saida.

Link para comentar
Compartilhar em outros sites


  • Tópicos Que Criei:  125
  • Tópicos/Dia:  0.02
  • Meu Conteúdo:  458
  • Conteúdo/Dia:  0.07
  • Reputação:   1
  • Pontos/Conquistas:  3.531
  • Conteúdo Resolvido:  0
  • Dias Ganho:  1
  • Status:  Offline
  • Idade:  44

É isso mesmo companheiro. Preciso de todos os documentos de uma fatura específica. Mas, não sei trabalhar com view. Caso posso mi ajuda desde já sou grato.

No aguardo..

Link para comentar
Compartilhar em outros sites


  • Tópicos Que Criei:  11
  • Tópicos/Dia:  0.00
  • Meu Conteúdo:  186
  • Conteúdo/Dia:  0.03
  • Reputação:   0
  • Pontos/Conquistas:  1.035
  • Conteúdo Resolvido:  0
  • Dias Ganho:  0
  • Status:  Offline
  • Idade:  37

É isso mesmo companheiro. Preciso de todos os documentos de uma fatura específica. Mas, não sei trabalhar com view. Caso posso mi ajuda desde já sou grato.

No aguardo..

CompanheirA rs sem problemas isso é comum aqui no fórum rs

Então Marcelo, primeira coisa que precisamos é criar uma função....melhor fazer tudo em base teste, bla, bla, bla rs

Abra seu SQL e rode o seguinte:

/* Essa função servirá para trazer todos os números de documento dos lançamentos em uma única coluna.
Perceba que logo após instruir o sql a criar a função eu nomeei, poderia ser qualquer outro nome mas,
convem iniciar com fn, para lembrar que se trata de uma FuNção.*/

CREATE FUNCTION fn_titulos(
--Depois declarei as variáveis que vão ajudar a determinar quais serão os números de doc a serem retornados. 

@CLIFOR as varchar(10),
@ANO as varchar(04),
@MES as varchar(02),
@COLIG AS VARCHAR(1)
)

returns varchar(1500)--se precisar de um retorno maior basta aumentar o tamanho do varchar
as
BEGIN
DECLARE @TEXTO AS varchar(200)--@TEXTO é cada numero de documento encontrado
DECLARE @TEXTO1 AS varchar(1500)--@TEXTO1 é o texto completo que será exibido no final
DECLARE CLIFOR_cursor CURSOR FOR -- Declarando Cursor para capturar todos os n de doc e trazer para @TEXTO1
SELECT  -- Já está trazendo o n do doc, se quiser de outro campo é só alterar abaixo
CAST(SUBSTRING(F.NUMERODOCUMENTO,1,6) AS VARCHAR)
FROM FLAN F
WHERE F.CODCFO = @CLIFOR AND
	YEAR(F.DATAVENCIMENTO) = @ANO 
		AND MONTH(F.DATAVENCIMENTO) = @MES
		AND F.CODCOLIGADA = @COLIG
/*Perceba que só atribui as @ ao correto campo, caso precise fazer outros filtros e condições
aqui é o lugar correto */			

OPEN CLIFOR_cursor
FETCH NEXT FROM CLIFOR_cursor
INTO @TEXTO
SET @TEXTO1 = 'TÍTULO(S):' -- Atribui o texto TÍTULO(S): para aparecer no início do meu texto, pode alterar ou deixar ''(vazio)
WHILE @@FETCH_STATUS = 0
BEGIN
SET @TEXTO1 = @TEXTO1 + RTRIM(@TEXTO) + ' '
FETCH NEXT FROM CLIFOR_cursor
INTO @TEXTO
END
CLOSE CLIFOR_cursor
DEALLOCATE CLIFOR_cursor
RETURN ISNULL(@TEXTO1, 'NENHUM DOCUMENTO ENCONTRADO')
END

De uma olhada nos comentários para você incluir a sentença e variaveis adequadas etc feito isso vc pode fazer um teste dando um select na function

SELECT [corpore123].[dbo].[fn_titulos] (
  <@CLIFOR, varchar(10),> --Lembre que o clifor deve estar entre ' ' para funcionar
 ,<@ANO, varchar(4),>
 ,<@MES, varchar(2),>
 ,<@COLIG, varchar(1),>)
GO

você perceberá que ele criou uma única coluna com todos os seus numeros de documento...

agora como eu to sem o sistema na minha máquina (reinstalando máquinas virtuais eheheh) não posso testar se vc pode usar a funçao diretamente no gerador....ou no utilitário de sql do rm...

no gerador acho que só tem Stored Procedures...

então crie uma consulta no RM parecida com essa

SELECT 
c.codcoligada as codcol ,c.CODCFO AS CODIGO, 
c.CGCCFO AS CPF_CNPJ, NOME , c.CIDADE, c.CODETD AS ESTADO,
dbo.fn_titulos(f.CODCFO, YEAR(f.DATAVENCIMENTO) , month(f.DATAVENCIMENTO) , f.CODCOLIGADA) as titulo --perceba que usei um dbo na frente p chamar a função com o privilégio de exec
FROM FCFO c left join FLAN f on (c.CODCFO = f.CODCFO and f.CODCOLCFO = c.CODCOLIGADA)

Se não funcionar......crie uma View, relaxe suuuuper fácil rs

CREATE VIEW VW_CLIFOR
AS --Pronto 2 linhas que vc n'ao sabia....daí p baixo eh o bom e velho Select rsrs
SELECT 
c.codcoligada as codcol ,c.CODCFO AS CODIGO, 
c.CGCCFO AS CPF_CNPJ, NOME , c.CIDADE, c.CODETD AS ESTADO,
dbo.fn_titulos(f.CODCFO, YEAR(f.DATAVENCIMENTO) , month(f.DATAVENCIMENTO) , f.CODCOLIGADA) as titulo
FROM FCFO c left join FLAN f on (c.CODCFO = f.CODCFO and f.CODCOLCFO = c.CODCOLIGADA)
WHERE c.PAGREC <>1

Bem se com a View vc tb não conseguir trazer p Consulta SQL do Rm me avise....pq Stored Procedure ele aceita...ou então podemos discutir outras formas de fazer o seu relatório fora do RM

Ah se depois tudo funcionar da prox q eu for em Aracaju vc vai me pagar uns bons caranguejos fechado? huauhahuahua

Por sinal onde vc trabalha aí?

Link para comentar
Compartilhar em outros sites

Participe da conversa

Você pode postar agora, e se registrar mais tarde. Se você tiver uma conta, faça o login agora para postar com sua conta.

Visitante
Responder esse tópico

×   Você colou conteúdo com formatação.   Remover formatação

  Only 75 emoji are allowed.

×   Seu link foi automaticamente inserido no corpo do post.   Exibir como um link

×   Seu conteúdo anterior foi restaurado.   Limpar conteúdo do editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Criar Novo...

Informação Importante

Usando este site, você concorda com nossos Termos de Uso e nossa Política de Privacidade.