Adaptar uma pesquisa usando o Pivot.

SQL Server

02/03/2016

Ola Galera boa tarde!!!

Estou pensando em adaptar uma pesquisa que tenho atual, para usar o pivot, so que para variar um pouco, não sei usar o pivot. rsrsr

Não sei nem por onde começar a alteração.

Vou postar a consulta para ver se conseguem me ajudar.

DECLARE @INICIO DATETIME, @FIM DATETIME, @DATA DATETIME, @QUANTIDADE DECIMAL(10)
SET @INICIO = [DADO1]
SET @FIM = [DADO2]
SET @DATA = @INICIO
SET @QUANTIDADE = 0

WHILE @DATA <= @FIM
BEGIN
IF (DATEPART(WEEKDAY, @DATA) = 7)
SET @QUANTIDADE = @QUANTIDADE + 1

SET @DATA = DATEADD(DAY,1,@DATA)
END

SELECT
   R.CODLOJ+R.CODVEN+SUBSTRING((CONVERT(VARCHAR(10),((R.DATEMI - DAY(R.DATEMI)) +1),103)),4,8) AS CHAVE,
   CASE 
      WHEN R.CODLOJ='001' THEN '001 - LAPA'
      WHEN R.CODLOJ='002' THEN '002 - FREGUESIA'
      WHEN R.CODLOJ='003' THEN '003 - PINHEIROS'
      WHEN R.CODLOJ='004' THEN '004 - JUNDIAI'
      WHEN R.CODLOJ='005' THEN '005 - TATUAPE'
      WHEN R.CODLOJ='006' THEN '006 - OSASCO'
   ELSE 'SEM LOJA'
   END AS Loja,
   R.CODVEN+'-'+V.NOME AS VENDEDOR,
   SUBSTRING((CONVERT(VARCHAR(10),((R.DATEMI - DAY(R.DATEMI)) +1),103)),4,8) mesano,
   CASE 
      WHEN R.TIPOREQ = 'VD' THEN COUNT(R.NUMREQ) 
   ELSE 0 
   END AS QTDVDA,
   CASE 
      WHEN R.TIPOREQ = 'VD' THEN SUM(R.TOTGERAL) 
   ELSE 0 
   END AS TOTVDA,
   CASE 
      WHEN R.TIPOREQ = 'DV' THEN COUNT(R.NUMREQ) 
   ELSE 0 
   END AS QTDDEV,
   CASE 
      WHEN R.TIPOREQ = 'DV' THEN SUM(R.TOTGERAL) 
   ELSE 0 
   END AS TOTDEV,
   SUM(R.TOTGERAL) AS TOTAL,
   SUM(R.TOTGERAL) AS PARTIC,
   SUM(R.TOTGERAL*0) AS TIQMEDIO,
   SUM(R.TOTGERAL*0) AS MEDIAVDA,
   SUM(R.TOTGERAL*0) AS MEDIALIQVDA,
   (((SELECT
      (DATEDIFF(dd, [DADO1], [DADO2]) + 1)
      -(DATEDIFF(wk, [DADO1], [DADO2]) * 2)
      )+(@QUANTIDADE/3))-('[DADO5]')))        AS DUTEIS,
   (SELECT 
       SUM(R.TOTGERAL) 
    FROM  AS R
    WHERE (R.TIPOREQ = 'VD')
       AND(R.DATEMI >= [DADO1])
       AND(R.DATEMI <= [DADO2])
       AND(R.CODCPV NOT IN [DADO4])) AS TOTGERAL
FROM  AS R
LEFT JOIN  AS V ON(V.CODCLI=R.CODVEN)
WHERE (R.TIPOREQ IN ('VD','DV'))
   AND(R.DATEMI >= [DADO1])
   AND(R.DATEMI <= [DADO2])
   AND(R.CODVEN  = [DADO3])
   AND(R.CODCPV NOT IN [DADO4])
   AND(R.CODVEN NOT IN [DADO7])
GROUP BY R.CODLOJ,R.TIPOREQ,R.CODVEN,V.NOME,SUBSTRING((CONVERT(VARCHAR(10),((R.DATEMI - DAY(R.DATEMI)) +1),103)),4,8)
ORDER BY R.CODLOJ,R.CODVEN,SUBSTRING((CONVERT(VARCHAR(10),((R.DATEMI - DAY(R.DATEMI)) +1),103)),4,8)
Alex Lekao

Alex Lekao

Curtidas 0

Respostas

Isaac Jose

Isaac Jose

02/03/2016

Ola Galera boa tarde!!!

Estou pensando em adaptar uma pesquisa que tenho atual, para usar o pivot, so que para variar um pouco, não sei usar o pivot. rsrsr

Não sei nem por onde começar a alteração.

Vou postar a consulta para ver se conseguem me ajudar.

DECLARE @INICIO DATETIME, @FIM DATETIME, @DATA DATETIME, @QUANTIDADE DECIMAL(10)
SET @INICIO = [DADO1]
SET @FIM = [DADO2]
SET @DATA = @INICIO
SET @QUANTIDADE = 0

WHILE @DATA <= @FIM
BEGIN
IF (DATEPART(WEEKDAY, @DATA) = 7)
SET @QUANTIDADE = @QUANTIDADE + 1

SET @DATA = DATEADD(DAY,1,@DATA)
END

SELECT
   R.CODLOJ+R.CODVEN+SUBSTRING((CONVERT(VARCHAR(10),((R.DATEMI - DAY(R.DATEMI)) +1),103)),4,8) AS CHAVE,
   CASE 
      WHEN R.CODLOJ='001' THEN '001 - LAPA'
      WHEN R.CODLOJ='002' THEN '002 - FREGUESIA'
      WHEN R.CODLOJ='003' THEN '003 - PINHEIROS'
      WHEN R.CODLOJ='004' THEN '004 - JUNDIAI'
      WHEN R.CODLOJ='005' THEN '005 - TATUAPE'
      WHEN R.CODLOJ='006' THEN '006 - OSASCO'
   ELSE 'SEM LOJA'
   END AS Loja,
   R.CODVEN+'-'+V.NOME AS VENDEDOR,
   SUBSTRING((CONVERT(VARCHAR(10),((R.DATEMI - DAY(R.DATEMI)) +1),103)),4,8) mesano,
   CASE 
      WHEN R.TIPOREQ = 'VD' THEN COUNT(R.NUMREQ) 
   ELSE 0 
   END AS QTDVDA,
   CASE 
      WHEN R.TIPOREQ = 'VD' THEN SUM(R.TOTGERAL) 
   ELSE 0 
   END AS TOTVDA,
   CASE 
      WHEN R.TIPOREQ = 'DV' THEN COUNT(R.NUMREQ) 
   ELSE 0 
   END AS QTDDEV,
   CASE 
      WHEN R.TIPOREQ = 'DV' THEN SUM(R.TOTGERAL) 
   ELSE 0 
   END AS TOTDEV,
   SUM(R.TOTGERAL) AS TOTAL,
   SUM(R.TOTGERAL) AS PARTIC,
   SUM(R.TOTGERAL*0) AS TIQMEDIO,
   SUM(R.TOTGERAL*0) AS MEDIAVDA,
   SUM(R.TOTGERAL*0) AS MEDIALIQVDA,
   (((SELECT
      (DATEDIFF(dd, [DADO1], [DADO2]) + 1)
      -(DATEDIFF(wk, [DADO1], [DADO2]) * 2)
      )+(@QUANTIDADE/3))-('[DADO5]')))        AS DUTEIS,
   (SELECT 
       SUM(R.TOTGERAL) 
    FROM  AS R
    WHERE (R.TIPOREQ = 'VD')
       AND(R.DATEMI >= [DADO1])
       AND(R.DATEMI <= [DADO2])
       AND(R.CODCPV NOT IN [DADO4])) AS TOTGERAL
FROM  AS R
LEFT JOIN  AS V ON(V.CODCLI=R.CODVEN)
WHERE (R.TIPOREQ IN ('VD','DV'))
   AND(R.DATEMI >= [DADO1])
   AND(R.DATEMI <= [DADO2])
   AND(R.CODVEN  = [DADO3])
   AND(R.CODCPV NOT IN [DADO4])
   AND(R.CODVEN NOT IN [DADO7])
GROUP BY R.CODLOJ,R.TIPOREQ,R.CODVEN,V.NOME,SUBSTRING((CONVERT(VARCHAR(10),((R.DATEMI - DAY(R.DATEMI)) +1),103)),4,8)
ORDER BY R.CODLOJ,R.CODVEN,SUBSTRING((CONVERT(VARCHAR(10),((R.DATEMI - DAY(R.DATEMI)) +1),103)),4,8)
GOSTEI 0
Isaac Jose

Isaac Jose

02/03/2016

boa tarde Alex blz..
mano só tenho como te passar um exemplo agora..estou indo embora...
mais amanha ou mais tarde tento entender melhor isso abraço.


SELECT codag, Tipo_Pessoa, Meta
Into producao.Tb_MetasPFPJ_Dia_AG
FROM
(SELECT DISTINCT
A.codag,
[PF] = CASE WHEN A.PF IS NOT NULL THEN a.PF END,
[PJ] = CASE WHEN A.PJ IS NOT NULL THEN a.PJ END

from producao.Tb_Metaag_PFPJ A) P
UNPIVOT
(Meta FOR Tipo_Pessoa IN ([PF], [PJ])
) AS UNPVT

GO
GOSTEI 0
Alex Lekao

Alex Lekao

02/03/2016

OI Isaac, blz.

sem crise.

cara, to tomando uma surra do carramba nesse tal de pivot. rsrsr

ta doido veio, tive ate que parar um pouco q as ideias estavam conflitando. rsrsr
GOSTEI 0
Isaac Jose

Isaac Jose

02/03/2016

bom dia lekão ... poderia explicar como estão as suas informações e como quer?
já tentou fazer com case?
GOSTEI 0
Alex Lekao

Alex Lekao

02/03/2016

Oi Isaac, bom dia!!!

Entao, eu tenho quero pegar o periodo de vendas de um ano, e agrupar por mes e car os valores de vendas, devolucoes, vendas liquidas, qtd de vendas, qtd de devolucoes, e qtds liquidas, etc.

Da forma que esta atualmente ate atende, mas os meses sao apresentados sequencialmente por linha, eu gostaria que eles fossem apresentados por colunas.

Ja quebrei bastante a cabeca com isso, e nunca consegui pensar em uma forma de fazer.

com o case nao sei se ficaria dinamico, ja ate utilizei o case em outras situacoes que eram similares a essa, mas nao ficou muito bom. rsrsr
GOSTEI 0
Isaac Jose

Isaac Jose

02/03/2016

entendi ... tenho algo do tipo.. me manda um script de criação dessas tables e um pouco de insert no meu email que faço algo pra vc..
GOSTEI 0
Alex Lekao

Alex Lekao

02/03/2016

qual o seu e-mail? rsrsr

nao sei se ja tenho. srsr

ou manda para um e-mail para mim que respondo. rsrsr

alex_linhares_es@yahoo.com.br
GOSTEI 0
Isaac Jose

Isaac Jose

02/03/2016

tem kkkkk...
olha tenho pronto algo desse tipo..
---campos em 3 colunas uma para cada produto

select a.campo1,a.campo2,a.campo3
max(a.prodi1 )as prodi1 ,max(a.prodi2 )as prodi2, max(a.prodi3 )as prodi3 ,
----campos em uma coluna de produtos
from (select
prodi1 = case when b.tintCodCart = 1 then b.monVlrCart
end,
prod12 = case when b.tintCodCart =122 then b.monVlrCart
end,
prodi3 = case when b.tintCodCart = 3 then b.monVlrCart
end,
a.campo1,a.campo2,a.campo3

from tb1 a left join
tb2 b on a.campo1 = b.campo1 and
a.campo2 = b.campo2 left join
tb3 c on b.tintCodCart = c.tintCodCart
where b.sintAno = 2016 and b.tintMes = 2)a
group by a.campo1,a.campo2,a.campo3
order by a.campo1,a.campo2,a.campo3


vou te mandar um email.
GOSTEI 0
Alex Lekao

Alex Lekao

02/03/2016

legal...

cara, esse negocio do pivot da um nó na minha cabeca, acho que o problema eh comigo mesmo. srsr
GOSTEI 0
Isaac Jose

Isaac Jose

02/03/2016

que nada... kkk ..
manda ai vamos montar dos dois jeitos basicamente é a mesma coisa mais ai vc testa pra ver qual é mais performático.
GOSTEI 0
Alex Lekao

Alex Lekao

02/03/2016

blz.

Obrigado.
GOSTEI 0
João Françozo

João Françozo

02/03/2016

Olá Alex,

Segue um modelo que fiz alguns dias atrás.

Como pode observar o SQL, fiz a soma de quantidade de produtos agrupados por dia, no pivot lá em baixo fiz a soma da coluna QTDE_KG e coloquei os dias do Meses.
Observa que a soma da QTDE_KG esta for DIAS (referente).

Depende a versão do SQL SERVER tem que habilitar esse recurso.
EXEC sp_dbcmptlevel BASEDADOS,90

Se precisa meu Skype é JOAOTASSOLI

SELECT * FROM
(SELECT
DAY(E.DATA_MOVTO) AS DIAS,
SUM(IT.QTDE_PRI) AS QTDE_KG,
IT.COD_PRODUTO,
R.DESC_PRODUTO_EST
FROM TBENTRADAS E
INNER JOIN TBENTRADASITEM IT
ON IT.CHAVE_FATO = E.CHAVE_FATO
INNER JOIN TBPRODUTO R
ON R.COD_PRODUTO = IT.COD_PRODUTO
WHERE
E.COD_TIPO_MV ='622' AND
E.DATA_MOVTO BETWEEN '20120801' AND '20120804'
GROUP BY
IT.COD_PRODUTO,
R.DESC_PRODUTO_EST,
E.DATA_MOVTO) AS PROD


PIVOT
(SUM(QTDE_KG) FOR DIAS IN
([01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])
) AS PIVOTTABLE
GOSTEI 0
Alex Lekao

Alex Lekao

02/03/2016

oi Joao, boa tarde!!!

Cara, estou pensando em fazer algo dinamico, no caso, que as colunas sejam "criadas" de acordo com o que for aparecendo. rsrs

Mas ja me enrolei de novo e vou ter que deixar meio que em aberto por enquanto. rsrsr

Obrigado desde ja pela ajuda.
GOSTEI 0
POSTAR