Deixar um select em Loop

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
isacoliveira
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 25 Abr 2019 12:01 pm

Bom, tenho que fazer um relatório que contenha os 10 clientes que mais gastaram com cada vendedor, porem o select que eu fiz eu consegui mostrar os clientes de só 1 vendedor

O comando SQL que estou usando:

Selecionar tudo

 SELECT *
   FROM (SELECT FILIAL, VENDEDOR, CODV, CLIENTE, SUM(VALOR), PERIODO
           FROM (SELECT ITPED.CODFIL FILIAL,
                        ITPED.CODVENDR CODV,
                        MAX(VEND.NOME) VENDEDOR,
                        CLIENTE.NOMCLI CLIENTE,
                        SUM(ITPED.VLTOTITEM) VALOR,
                        TO_CHAR(ITPED.DTPEDIDO, 'mm/yyyy') PERIODO
                   FROM MOV_ITPED   ITPED,
                        CAD_ITPROD  ITPROD,
                        VEN_VEND    VEND,
                        CAD_CLIENTE CLIENTE
                  WHERE ITPROD.CODITPROD = ITPED.CODITPROD AND
                        ITPED.CODVENDR = VEND.CODVENDR AND
                        ITPED.CODFIL = VEND.CODFIL AND
                        ITPED.CODCLI = CLIENTE.CODCLI AND
                        ITPED.CODVENDR = 294 AND
                        ITPED.DTPEDIDO BETWEEN '01/03/2019' AND '18/04/2019' AND
                        ITPED.CODFIL = 3 AND ITPED.STATUS <> 9
                  GROUP BY ITPED.CODFIL,
                           ITPED.CODVENDR,
                           ITPED.DTPEDIDO,
                           CLIENTE.NOMCLI
                 
                 UNION ALL
                 
                 SELECT ITSAIDA.CODFIL FILIAL,
                        ITSAIDA.CODVENDR CODV,
                        MAX(VEND.NOME) VENDEDOR,
                        CLIENTE.NOMCLI CLIENTE,
                        SUM(ITSAIDA.VLTOTITEM) VALOR,
                        TO_CHAR(ITSAIDA.DTNOTA, 'mm/yyyy') PERIODO
                   FROM MOV_ITSAIDA ITSAIDA,
                        CAD_ITPROD  ITPROD,
                        VEN_VEND    VEND,
                        CAD_CLIENTE CLIENTE
                  WHERE ITPROD.CODITPROD = ITSAIDA.CODITPROD AND
                        ITSAIDA.CODVENDR = VEND.CODVENDR AND
                        ITSAIDA.CODFIL = VEND.CODFIL AND
                        ITSAIDA.CODCLI =
                        CLIENTE.CODCLI AND - ITSAIDA.CODVENDR = 294 AND
                        ITSAIDA.DTNOTA BETWEEN '01/03/2019' AND '18/04/2019' AND
                        ITSAIDA.CODFIL = 3 AND ITSAIDA.STATUS <> 9
                  GROUP BY ITSAIDA.CODFIL,
                           ITSAIDA.CODVENDR,
                           CLIENTE.NOMCLI,
                           ITSAIDA.DTNOTA)
          GROUP BY FILIAL, VENDEDOR, CODV, CLIENTE, PERIODO
          ORDER BY 3 ASC, 5 DESC)
  WHERE ROWNUM <= 10;

Estava pesquisando se era possível deixar um Select em Loop mudando o CODVENDR para que ele consulte o codigo de todos o vendedores, mas não obtive sucesso nisso
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

isacoliveira escreveu:Estava pesquisando se era possível deixar um Select em Loop mudando o CODVENDR para que ele consulte o codigo de todos o vendedores, mas não obtive sucesso nisso
Você já pesquisou sobre cursores ?
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

Você ta filtrando pra vir somente 1 vendedor:

Selecionar tudo

ITSAIDA.CODVENDR = 294
Tem como fazer apenas com uma query:
Exemplo: Abaixo a lista de todos departamentos e seus salarios.

Selecionar tudo

SQL> select deptno, sal, ename
  2  from emp
  3  order by 1,2 desc
  4  /

DEPTNO       SAL ENAME
------ --------- ----------
    10   5000.00 KING
    10   2450.00 CLARK
    10   1300.00 MILLER
    20   3000.00 SCOTT
    20   3000.00 FORD
    20   2975.00 JONES
    20   1100.00 ADAMS
    20    800.00 SMITH
    30   2850.00 BLAKE
    30   1600.00 ALLEN
    30   1500.00 TURNER
    30   1250.00 WARD
    30   1250.00 MARTIN
    30    950.00 JAMES

14 rows selected


SQL> 

Agora, apenas os 2 maiores de cada departamento!

Selecionar tudo

SQL> SELECT *
  2  FROM
  3    (
  4    SELECT
  5      deptno
  6    , ename
  7    , sal
  8    , ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) Top2
  9    FROM emp
 10    )
 11  WHERE Top2 <= 2
 12  /

DEPTNO ENAME            SAL       TOP2
------ ---------- --------- ----------
    10 KING         5000.00          1
    10 CLARK        2450.00          2
    20 SCOTT        3000.00          1
    20 FORD         3000.00          2
    30 BLAKE        2850.00          1
    30 ALLEN        1600.00          2

6 rows selected


SQL> 
Veja outra forma:
(repare que pro departamento 20 existem 2 salários de 3000. Pra esse caso, ele retornou 3 linhas pro departamento 20! Pois duas ficaram como numero 1:

Selecionar tudo

SQL> SELECT *
  2  FROM
  3    (
  4    SELECT
  5      deptno
  6    , ename
  7    , sal
  8    , DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal desc) TopN
  9    FROM emp
 10    )
 11  WHERE TopN <= 2
 12  ORDER BY deptno, sal DESC
 13  /

DEPTNO ENAME            SAL       TOPN
------ ---------- --------- ----------
    10 KING         5000.00          1
    10 CLARK        2450.00          2
    20 SCOTT        3000.00          1    <------
    20 FORD         3000.00          1    <------
    20 JONES        2975.00          2
    30 BLAKE        2850.00          1
    30 ALLEN        1600.00          2

7 rows selected


SQL> 
Responder
  • Informação
  • Quem está online

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