Calculando média de resultado PIVOT - SQL Server

07/03/2017

0

Pessoal, boa tarde.

Estou com uma dúvida no código para calcular uma média a partir de um resultado obtido por PIVOT. Segue o código:

SELECT * FROM (Select cliente, total_nota AS total, periodo FROM

(SELECT (T0.CardCode) AS codigo,
CASE T0.GroupCode WHEN '109' THEN 'Brokers Supreme' WHEN '112' THEN 'Distribuição Direta' ELSE 'Outros' END AS grupo,
T0.CardName AS cliente,
T1.DocTotal AS total_nota,
T2.CFOPCode AS cfop,
T1.DocDate AS data_emissao,
FORMAT(T1.DocDate,'MM-yyyy') AS periodo

FROM OCRD T0
INNER JOIN OINV T1 ON T0.CardName = T1.CardName
INNER JOIN INV1 T2 ON T0.CardCode = T1.CardCode
WHERE T0.GroupCode IN ('109','112') AND T2.CFOPCode IN ('5401','6401','6105')) AS tab GROUP BY cliente, periodo, total_nota) AS tib
PIVOT (SUM(total) FOR periodo IN ([07-2016],[08-20016],[09-2016],[10-2016],[11-2016],[12-2016],[01-2017],[02-2017],[03-2017]) ) AS PT


Obtenho o seguinte resultado:

cliente 07-2016 08-2016 09-2016 10-2016 11-2016 12-2016 01-2017 02-2017 03-2017

AAAAAA NULL NULL NULL NULL 683.990000 NULL NULL NULL NULL
BBBBBB NULL NULL 1525.970000 NULL 634.000000 NULL NULL NULL NULL
CCCCCC NULL NULL NULL NULL 1629.990000 NULL NULL NULL NULL
DDDDDD NULL NULL NULL 1469.980000 366.000000 NULL NULL NULL NULL
EEEEEE NULL NULL 2048.970000 4069.020000 NULL NULL NULL NULL NULL


Tentei utilizar a função dbo.fnMedia mas não obtive resultado. Recebi que "130 linhas foram afetadas" mas não retornava a tabela com o calculo realizado.

Existe alguma maneira mais simples de realizar esta função a partir deste ponto? Lembrando que estou utilizando a função PIVOT para agregar os valores nas respectivas colunas/períodos.

Obrigado.
Marcos Queiroz

Marcos Queiroz

Responder

Posts

09/03/2017

David Styveen

Bom dia, Marcos Queiroz.

Desculpa, mas não entendi a sua necessidade.
Em todo caso, a função AVG resolveria?

AVG
Responder

09/03/2017

Marcos Queiroz

Olá, Styveen. Td certo?

Eu fiz uma consulta juntando duas tabelas. Essa consulta mostra vários clientes, as respectivas notas fiscais, data de emissão e valor dessas notas, linha por linha. O que fiz foi unificar essas linhas e distribuir os valores, mês a mês, utilizando o PIVOT. O que eu queria era que, ao final dessa consulta, fosse gerada uma nova coluna com a média de cada cliente.

Com o AVG eu não obtive sucesso, ou então eu não soube usá-la em conjunto com a função PIVOT.
Responder

10/03/2017

David Styveen

Olá Marcos, tudo certo e contigo?

Agora entendi a necessidade. AVG vai fazer a média de um agrupamento (GROUP BY).
Bom, tenta executar esse script pra ver se atende a necessidade:

SELECT * FROM (
Select cliente, total_nota AS total, periodo, media FROM
(
	SELECT (T0.CardCode) AS codigo
		  ,CASE T0.GroupCode WHEN '109' THEN 'Brokers Supreme' WHEN '112' THEN 'Distribuição Direta' ELSE 'Outros' END AS grupo
		  ,T0.CardName AS cliente
		  ,T1.DocTotal AS total_nota
		  ,T2.CFOPCode AS cfop
		  ,T1.DocDate AS data_emissao
		  ,FORMAT(T1.DocDate,'MM-yyyy') AS periodo
		  ,avg(T1.DocTotal) over (partition by T0.CardCode) as media
	FROM OCRD T0
	INNER JOIN OINV T1 ON T0.CardName = T1.CardName
	INNER JOIN INV1 T2 ON T0.CardCode = T1.CardCode
WHERE T0.GroupCode IN ('109','112') AND T2.CFOPCode IN ('5401','6401','6105')
) AS tab GROUP BY cliente, periodo, total_nota, media) AS tib
PIVOT (SUM(total) FOR periodo IN ([07-2016],[08-20016],[09-2016],[10-2016],[11-2016],[12-2016],[01-2017],[02-2017],[03-2017]) 

) AS PT


Abraços
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar