02/03/2016

Adaptar uma pesquisa usando o Pivot.

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

Respostas

02/03/2016

Isaac Jose

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)
Responder Citar

02/03/2016

Isaac Jose

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
Responder Citar

02/03/2016

Alex Lekao

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
Responder Citar

03/03/2016

Isaac Jose

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

03/03/2016

Alex Lekao

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
Responder Citar

03/03/2016

Isaac Jose

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..
Responder Citar

03/03/2016

Alex Lekao

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
Responder Citar

03/03/2016

Isaac Jose

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.
Responder Citar

03/03/2016

Alex Lekao

legal...

cara, esse negocio do pivot da um nó na minha cabeca, acho que o problema eh comigo mesmo. srsr
Responder Citar

03/03/2016

Isaac Jose

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

03/03/2016

Alex Lekao

blz.

Obrigado.
Responder Citar

03/03/2016

João Antonio Currículo

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
Responder Citar

07/03/2016

Alex Lekao

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.
Responder Citar