Ajuda para montar essa SQL

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Boa tarde, tenho 2 SQLs e queria agrupar em apenas um comando, é possível?
Segue as SQLs

Selecionar tudo

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_preço.preço PRECOVENDA,
       CAD_preço.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_preço,
       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_preço.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_preço.CODEMBAL = CAD_EMBAL.CODEMBAL
   AND CAD_preço.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_preço.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

Selecionar tudo

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)
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

acho que tem que usar sql analitico


OVER
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Como assim sql analitico?
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

eu não manjo muito, mas da uma olhada nos links:

http://www.orafaq.com/node/55

http://psoug.org/reference/analytic_functions.html

talvez de pra fazer diferente, mas essas soluções são bastante "elegantes".
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Bom dia, fiz dessa forma

Selecionar tudo

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_preço.preço       VLRVENDA,
               VEN_PRODFIL.CUE       CUSTO
          FROM CAD_preço,
               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_preço.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_preço.CODEMBAL = CAD_EMBAL.CODEMBAL
           AND CAD_preço.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_preço.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
Imagem
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Tentei dessa forma também

Selecionar tudo

SELECT ITP.CODPRODDF,
       PRD.DESCRICAO,
       GRP.DESCRICAO,
       EXTRACT(YEAR FROM ESP.DTVENDA) ANO,
       EXTRACT(MONTH FROM ESP.DTVENDA) mês,
       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 o resultado foi o mesmo, retornou mais de uma linha para o mesmo código
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Facc,

Você conseguiu resolver o seu problema?

Por acaso você deseja que a querie final retorne somente uma linha por produto?

Att.

Sergio
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Não consegui resolver ainda.

É isso mesmo que eu precisava, retornar uma linha, mas to achando que dessa forma é complicado de se fazer.

O que eu necessito é mais ou menos isso:

Uma tabela de produtos que contém os dados do produto, e uma de estoque/vendas, onde são guardadas quantas saidas teve no determinado mês. Preciso que retorne as saidas dos ultimos 6 meses e essa select faz exatamente isso:

Selecionar tudo

SELECT EXTRACT(MONTH FROM DTVENDA) MVENDAS1,
		     EXTRACT(YEAR FROM DTVENDA) YVENDAS1,
	             SUM(QTVENDA - QTDEVOLVIDO) QTD
			FROM EST_PROD
		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), EXTRAT(YEAR FROM DTVENDA)
		ORDER BY 1 DESC, 2 DESC
E a anterior, traz os dados do produto.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Talvez minha pergunta seja um pouco estranha, mas você precisava de algo assim?

Selecionar tudo


         SELECT [DADOS_DO_PRODUTO],
                     [<mês-0,ANO>,QTD],
                     [<mês-1,ANO>,QTD],
                     [<mês-2,ANO>,QTD],
                     [<mês-3,ANO>,QTD],
                     [<mês-4,ANO>,QTD],
                     [<mês-5,ANO>,QTD],
                     [<mês-6,ANO>,QTD]
            FROM .... 
Se for este o seu caso, você vai precisar desenvolver alguma função PL/SQL para que os resultados da segunda querie retornem em uma única linha.

Você consegue obter alguns exemplos de funções como esta no ASKTOM. É um pouco trabalhoso, mas não seria impossível.

Att.

Sergio
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

é, seria mais ou menos isso.

Vou dar uma olhada nesse site.

Qualquer coisa posto aqui.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes