- Este tópico contém 14 respostas, 5 vozes e foi atualizado pela última vez 13 anos, 6 meses atrás por facc.
-
AutorPosts
-
20 de junho de 2011 às 11:54 pm #99740faccParticipante
Boa tarde, tenho 2 SQLs e queria agrupar em apenas um comando, é possível?
Segue as SQLs
SELECT CAD_ITPROD.CODPRODDF codant,
CAD_PROD.DESCRICAO produto,
CAD_PROD.DIFER,
LPAD(CAD_PROD.CODGRUPO, 2, 0) CODGRUPO,
CAD_GRUPO.DESCRICAO GRUPO,
CAD_FORNE.FANTASIA,
CAD_PRECO.preço PRECOVENDA,
CAD_PRECO.PDESCPROM,
VEN_PRODFIL.CMUP,
VEN_PRODFIL.CMUPI,
VEN_PRODFIL.CUE,
VEN_PRODFIL.CUEI,
VEN_PRODFIL.CUSTONF PRECOCOMPRA,
VEN_PRODFIL.TABELA,
CAD_PRODLOC.DTULTENT,
CAD_PRODLOC.QTDULTENT
FROM CAD_PRECO,
VEN_PRODFIL,
CAD_CODBARRA,
CAD_EMBAL,
CAD_ITPROD,
CAD_PROD,
CAD_ESPEC,
CAD_COR,
CAD_FAMILIA,
CAD_DIFER,
CAD_SITPRO,
CAD_PRODLOC,
CAD_PRODLOC CAD_PRODLOC_DEP,
CAD_FORNE,
CAD_GRUPO,
CAD_SUBGRUP,
CAD_TPPROD,
CAD_TRIBUT
WHERE (CAD_ITPROD.CODITPROD = 010333)
AND CAD_EMBAL.TPEMB IN ('C', 'V', 'T')
AND (CAD_EMBAL.STATUS <> 9 OR CAD_EMBAL.STATUS IS NULL)
AND (CAD_SITPRO.FLCONSULTA <> 'N')
AND CAD_PRECO.CODFIL = 999
AND VEN_PRODFIL.CODFIL = 999
AND CAD_PRODLOC.CODFIL = 999
AND CAD_PRODLOC.TPDEPOS = 'D'
AND CAD_PRODLOC_DEP.CODFIL = 999
AND CAD_PRODLOC_DEP.CODITPROD = CAD_ITPROD.CODITPROD
AND CAD_PRODLOC_DEP.TPDEPOS = 'D'
AND CAD_PRODLOC.CODITPROD = CAD_ITPROD.CODITPROD
AND CAD_ESPEC.CODFAM = CAD_ITPROD.CODFAM
AND CAD_ESPEC.ESPECIFIC = CAD_ITPROD.ESPECIFIC
AND CAD_COR.CODCOR = CAD_ITPROD.CODCOR
AND CAD_EMBAL.CODPROD = CAD_PROD.CODPROD
AND CAD_PRECO.CODEMBAL = CAD_EMBAL.CODEMBAL
AND CAD_PRECO.CODITPROD = CAD_ITPROD.CODITPROD
AND CAD_PROD.CODPROD = CAD_ITPROD.CODPROD
AND CAD_PROD.DIFER = CAD_DIFER.DIFER
AND VEN_PRODFIL.CODPROD = CAD_PROD.CODPROD
AND CAD_FAMILIA.CODFAM = CAD_ITPROD.CODFAM
AND CAD_FAMILIA.CODLINHA = CAD_ITPROD.CODLINHA
AND CAD_PRECO.CODSITPROD = CAD_SITPRO.CODSITPROD
AND CAD_CODBARRA.CODITPROD = CAD_ITPROD.CODITPROD
AND CAD_CODBARRA.CODEMBAL = CAD_EMBAL.CODEMBAL
AND CAD_ITPROD.CODGRUPO = CAD_GRUPO.CODGRUPO
AND CAD_ITPROD.CODSUBGP = CAD_SUBGRUP.CODSUBGP
AND CAD_FORNE.CODFORNE = CAD_ITPROD.CODFORNE
AND CAD_FAMILIA.CODFAM = CAD_GRUPO.CODFAM
AND CAD_FAMILIA.CODFAM = CAD_SUBGRUP.CODFAM
AND CAD_TPPROD.ESPECIAL = CAD_PROD.ESPECIAL
AND CAD_TRIBUT.CTF = CAD_PROD.CTF
AND (CAD_PROD.FLPRODRESIPI = 'N' OR CAD_PROD.FLPRODRESIPI IS NULL)
ORDER BY CAD_ITPROD.CODITPROD
Tras os dados do produto (preço, ultima compra, fornecedor…)
E quero agrupar com esse
SELECT EXTRACT(YEAR FROM DTVENDA) ANO,
EXTRACT(MONTH FROM DTVENDA) mês,
SUM(QTVENLIQ - QTDEVOL)
FROM EST_PROD
WHERE CODITPROD = 10333
AND TPDATA = 0
AND DTVENDA > TO_DATE('2010-12-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
GROUP BY EXTRACT(YEAR FROM DTVENDA), EXTRACT(MONTH FROM DTVENDA)
ORDER BY 1 DESC, 2 DESC
Tras as vendas dos últimos 6 meses de cada produto (detalhe: quando não possuir venda, trazer 0 – zero)21 de junho de 2011 às 4:01 pm #99741leandrolbsParticipanteO comando (“UNION” ALL” ) efetua a união de varias consultas.
Tuto:
http://www.techonthenet.com/sql/union_all.phpObs: Realmente a palavra U N I O N ALL dá pau no forum, não consigo postar…kkkkk
21 de junho de 2011 às 4:38 pm #99742faccParticipantePensei nessa possibilidade, mas funciona mesmo quando não possui os mesmos campos nas tabelas?
21 de junho de 2011 às 4:51 pm #99743leandrolbsParticipantetem que ser a mesma quantidade de colunas e o tipo tbm;
Errado:
select CAST('23' as number(2)) from dual
union all
select CAST('AA' as char(2)) from dual
Ok:
select to_char(CAST('23' as number(2))) from dual
union all
select CAST('23' as char(2)) from dual
21 de junho de 2011 às 6:12 pm #99746Manoel872ParticipanteTenta utilizar esta logica para resolver seu problema:
SELECT B.*, A.*
FROM HR.EMPLOYEES A,
(SELECT PL.DEPARTMENT_ID, SUM(PL.SALARY)
FROM HR.EMPLOYEES PL
GROUP BY PL.DEPARTMENT_ID) B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_IDUtilize um outer join para quando não tiver relação trazer o resultado + nvl para coloca-ló como 0.
Att,
Manoel Jr.
21 de junho de 2011 às 9:17 pm #99751faccParticipanteEu tentei fazer dessa forma, mas o meu problema é que envolve 3 tabelas diferentes
Pelo que eu conheço, o “Union All” funciona com a mesma tabela, ou estou errado?
21 de junho de 2011 às 9:21 pm #99752felipegParticipante[quote=”facc”:2f6pkxzb]Eu tentei fazer dessa forma, mas o meu problema é que envolve 3 tabelas diferentes
Pelo que eu conheço, o “Union All” funciona com a mesma tabela, ou estou errado?[/quote]
http://www.techonthenet.com/sql/union_all.php
http://www.linhadecodigo.com.br/artigo/ … N-ALL.aspx
http://download.oracle.com/docs/cd/B193 … m#i2054381
PS: O nosso amigo Leandro passou um link do site Tech On The Net que mostra um exemplo de UNION, você chegou a ler?
Atenciosamente,
Felipe.22 de junho de 2011 às 12:23 am #99759Manoel872ParticipanteFaac, boa tarde.
Não entendi, pois ambos os select tem uma chave em comou o campo:
CODITPROD = 10333
Att,
Manoel Jr.
22 de junho de 2011 às 12:46 am #99760faccParticipanteBoa tarde,
Mas o Select
SELECT CAD_ITPROD.CODPRODDF,
EXTRACT(YEAR FROM DTVENDA) ANO,
EXTRACT(MONTH FROM DTVENDA) MES,
SUM(QTVENLIQ - QTDEVOL) EST
FROM EST_PROD, CAD_ITPROD
WHERE (EST_PROD.CODITPROD = CAD_ITPROD.CODITPROD)
AND TPDATA = 0
AND DTVENDA > TO_DATE('2011-03-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
GROUP BY EXTRACT(YEAR FROM DTVENDA), EXTRACT(MONTH FROM DTVENDA), CAD_ITPROD.CODPRODDF
ORDER BY 1 DESC, 2 DESCRetorna mais de uma linha para o mesmo código, posso utilizar da mesma forma?
22 de junho de 2011 às 6:40 am #99765burgaParticipanteSe eu entendi bem o problema, eu também iria seguindo a idéia do que o Manoel postou na primeira mensagem…
22 de junho de 2011 às 4:25 pm #99769Manoel872ParticipanteUtiliza no outer join o mês e o ano para não gerar produto cartesiano.
Att,
Manoel Jr.
22 de junho de 2011 às 4:29 pm #99770faccParticipanteBom dia, fiz dessa forma
SELECT RES.CODIGO,
RES.PRODUTO,
RES.CODGRUPO,
RES.DESCGRUPO,
RES.FORNECEDOR,
RES.MVENDAS1,
RES.YVENDAS1,
RES.DTULTCOMP,
RES.QTDULTCOMP,
RES.VLRULTCOMP,
RES.ESTQDIAS,
RES.ESTQQTD,
RES.CUSTOATUAL,
RES.VLRVENDA,
RES.CUSTO
FROM (SELECT CAD_ITPROD.CODPRODDF CODIGO,
CAD_PROD.DESCRICAO PRODUTO,
CAD_PROD.CODGRUPO CODGRUPO,
CAD_GRUPO.DESCRICAO DESCGRUPO,
CAD_FORNE.FANTASIA FORNECEDOR,
0 MVENDAS1,
0 YVENDAS1,
CAD_PRODLOC.DTULTENT DTULTCOMP,
CAD_PRODLOC.QTDULTENT QTDULTCOMP,
VEN_PRODFIL.CUSTONF VLRULTCOMP,
0 ESTQDIAS,
0 ESTQQTD,
VEN_PRODFIL.CMUP CUSTOATUAL,
CAD_PRECO.PRECO VLRVENDA,
VEN_PRODFIL.CUE CUSTO
FROM CAD_PRECO,
VEN_PRODFIL,
CAD_CODBARRA,
CAD_EMBAL,
CAD_ITPROD,
CAD_PROD,
CAD_ESPEC,
CAD_COR,
CAD_FAMILIA,
CAD_DIFER,
CAD_SITPRO,
CAD_PRODLOC,
CAD_PRODLOC CAD_PRODLOC_DEP,
CAD_FORNE,
CAD_GRUPO,
CAD_SUBGRUP,
CAD_TPPROD,
CAD_TRIBUT
WHERE CAD_EMBAL.TPEMB IN ('C', 'V', 'T')
AND (CAD_EMBAL.STATUS 9 OR CAD_EMBAL.STATUS IS NULL)
AND (CAD_SITPRO.FLCONSULTA 'N')
AND CAD_PRECO.CODFIL = 999
AND VEN_PRODFIL.CODFIL = 999
AND CAD_PRODLOC.CODFIL = 999
AND CAD_PRODLOC.TPDEPOS = 'D'
AND CAD_PRODLOC_DEP.CODFIL = 999
AND CAD_PRODLOC_DEP.CODITPROD = CAD_ITPROD.CODITPROD
AND CAD_PRODLOC_DEP.TPDEPOS = 'D'
AND CAD_PRODLOC.CODITPROD = CAD_ITPROD.CODITPROD
AND CAD_ESPEC.CODFAM = CAD_ITPROD.CODFAM
AND CAD_ESPEC.ESPECIFIC = CAD_ITPROD.ESPECIFIC
AND CAD_COR.CODCOR = CAD_ITPROD.CODCOR
AND CAD_EMBAL.CODPROD = CAD_PROD.CODPROD
AND CAD_PRECO.CODEMBAL = CAD_EMBAL.CODEMBAL
AND CAD_PRECO.CODITPROD = CAD_ITPROD.CODITPROD
AND CAD_PROD.CODPROD = CAD_ITPROD.CODPROD
AND CAD_PROD.DIFER = CAD_DIFER.DIFER
AND VEN_PRODFIL.CODPROD = CAD_PROD.CODPROD
AND CAD_FAMILIA.CODFAM = CAD_ITPROD.CODFAM
AND CAD_FAMILIA.CODLINHA = CAD_ITPROD.CODLINHA
AND CAD_PRECO.CODSITPROD = CAD_SITPRO.CODSITPROD
AND CAD_CODBARRA.CODITPROD = CAD_ITPROD.CODITPROD
AND CAD_CODBARRA.CODEMBAL = CAD_EMBAL.CODEMBAL
AND CAD_ITPROD.CODGRUPO = CAD_GRUPO.CODGRUPO
AND CAD_ITPROD.CODSUBGP = CAD_SUBGRUP.CODSUBGP
AND CAD_FORNE.CODFORNE = CAD_ITPROD.CODFORNE
AND CAD_FAMILIA.CODFAM = CAD_GRUPO.CODFAM
AND CAD_FAMILIA.CODFAM = CAD_SUBGRUP.CODFAM
AND CAD_TPPROD.ESPECIAL = CAD_PROD.ESPECIAL
AND CAD_TRIBUT.CTF = CAD_PROD.CTF
AND (CAD_PROD.FLPRODRESIPI = 'N' OR CAD_PROD.FLPRODRESIPI IS NULL)
"UNION ALL"
SELECT CAD_ITPROD.CODPRODDF CODIGO,
' ' PRODUTO,
0 CODGRUPO,
' ' DESCGRUPO,
' ' FORNECEDOR,
EXTRACT(MONTH FROM DTVENDA) MVENDAS1,
EXTRACT(YEAR FROM DTVENDA) YVENDAS1,
NULL DTULTCOMP,
0 QTDULTCOMP,
0 VLRULTCOMP,
0 ESTQDIAS,
0 ESTQQTD,
0 CUSTOATUAL,
0 VLRVENDA,
0 CUSTO
FROM EST_PROD
INNER JOIN CAD_ITPROD ON (EST_PROD.CODITPROD = CAD_ITPROD.CODITPROD)
WHERE TPDATA = 0
AND DTVENDA >
TO_DATE('2011-03-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
GROUP BY EXTRACT(MONTH FROM DTVENDA),
EXTRACT(YEAR FROM DTVENDA),
CAD_ITPROD.CODPRODDF) RES
ORDER BY RES.CODIGO
e o resultado foi o seguinte
22 de junho de 2011 às 9:07 pm #99774faccParticipanteTentei dessa forma
SELECT ITP.CODPRODDF,
PRD.DESCRICAO,
GRP.DESCRICAO,
EXTRACT(YEAR FROM ESP.DTVENDA) ANO,
EXTRACT(MONTH FROM ESP.DTVENDA) MES,
SUM(ESP.QTVENLIQ - ESP.QTDEVOL) TOT
FROM CAD_ITPROD ITP,
CAD_PROD PRD,
CAD_GRUPO GRP,
CAD_FAMILIA FAM,
CAD_LINHA LNH,
EST_PROD ESP
WHERE ITP.CODPROD = PRD.CODPROD(+)
AND ITP.CODFAM = FAM.CODFAM(+)
AND FAM.CODFAM = GRP.CODFAM(+)
AND FAM.CODLINHA = LNH.CODLINHA(+)
AND ITP.CODGRUPO = GRP.CODGRUPO
AND ITP.CODITPROD = ESP.CODITPROD(+)
AND ESP.DTVENDA >
TO_DATE('01/12/2010 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
AND ESP.TPDATA = 0
GROUP BY ITP.CODPRODDF,
PRD.DESCRICAO,
GRP.DESCRICAO,
EXTRACT(YEAR FROM ESP.DTVENDA),
EXTRACT(MONTH FROM ESP.DTVENDA)
ORDER BY ITP.CODPRODDF, 4 DESC, 5 DESC
Mas também retornou mais de uma linha para o mesmo código, eu gostaria que exibisse apenas uma linha
22 de junho de 2011 às 9:18 pm #99775felipegParticipante[quote=”facc”:11626g5x]Tentei dessa forma
SELECT ITP.CODPRODDF,
PRD.DESCRICAO,
GRP.DESCRICAO,
EXTRACT(YEAR FROM ESP.DTVENDA) ANO,
EXTRACT(MONTH FROM ESP.DTVENDA) MES,
SUM(ESP.QTVENLIQ - ESP.QTDEVOL) TOT
FROM CAD_ITPROD ITP,
CAD_PROD PRD,
CAD_GRUPO GRP,
CAD_FAMILIA FAM,
CAD_LINHA LNH,
EST_PROD ESP
WHERE ITP.CODPROD = PRD.CODPROD(+)
AND ITP.CODFAM = FAM.CODFAM(+)
AND FAM.CODFAM = GRP.CODFAM(+)
AND FAM.CODLINHA = LNH.CODLINHA(+)
AND ITP.CODGRUPO = GRP.CODGRUPO
AND ITP.CODITPROD = ESP.CODITPROD(+)
AND ESP.DTVENDA >
TO_DATE('01/12/2010 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
AND ESP.TPDATA = 0
GROUP BY ITP.CODPRODDF,
PRD.DESCRICAO,
GRP.DESCRICAO,
EXTRACT(YEAR FROM ESP.DTVENDA),
EXTRACT(MONTH FROM ESP.DTVENDA)
ORDER BY ITP.CODPRODDF, 4 DESC, 5 DESC
Mas também retornou mais de uma linha para o mesmo código, eu gostaria que exibisse apenas uma linha[/quote]
Retornou EXATAMENTE a mesma linha?
Se for você pode
1 – Verificar a consistência dos seus dados e os filtros da query
2 – Usar a cláusula DISTINCT logo após o SELECTAtenciosamente,
Felipe.24 de junho de 2011 às 4:22 pm #99799faccParticipanteNão retornou a mesma linha, retornou dados diferentes.
Ou seja, está certa o Select, pois ele está agrupando os meses de venda de um determinado produto.Eu gostaria que esses resultados fossem apresentados “inline” para que eu possa “jogar” em outra tabela e mostrar em um relatório
-
AutorPosts
- Você deve fazer login para responder a este tópico.