Adaptar uma pesquisa usando o Pivot.
02/03/2016
0
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
Posts
02/03/2016
Isaac Jose
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)
02/03/2016
Isaac Jose
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
02/03/2016
Alex Lekao
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
03/03/2016
Isaac Jose
já tentou fazer com case?
03/03/2016
Alex Lekao
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
03/03/2016
Isaac Jose
03/03/2016
Alex Lekao
nao sei se ja tenho. srsr
ou manda para um e-mail para mim que respondo. rsrsr
alex_linhares_es@yahoo.com.br
03/03/2016
Isaac Jose
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.
03/03/2016
Alex Lekao
cara, esse negocio do pivot da um nó na minha cabeca, acho que o problema eh comigo mesmo. srsr
03/03/2016
Isaac Jose
manda ai vamos montar dos dois jeitos basicamente é a mesma coisa mais ai vc testa pra ver qual é mais performático.
03/03/2016
João Françozo
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
07/03/2016
Alex Lekao
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.
Clique aqui para fazer login e interagir na Comunidade :)