1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

ajuda ORACLE SQL

Discussão em 'Programação' iniciada por UnCiViLiZeD, 5 de Dezembro de 2006. (Respostas: 2; Visualizações: 1396)

  1. Boas tenho uma pequena duvida...
    Tenho como objectivo o nome completo e valor total de vendas dos vendedores que mais vendas
    efectuaram por loja e ano.

    Fiz a seguinte query:
    SELECT emp.nome, inst.nome, to_char(cmpr.data_compra,'YYYY'), SUM(cmpr.preco_venda), COUNT(*)
    FROM empregado emp, instalacao inst, compra cmpr, contrato cont
    WHERE (emp.num = cmpr.num) AND (cont.cod = inst.cod) AND (cont.num = emp.num)
    AND (cont.ano = to_char(cmpr.data_compra,'YYYY'))
    GROUP BY emp.nome, inst.nome, to_char(cmpr.data_compra,'YYYY');

    Resultado:
    NOME NOME TO_CHAR(CMPR.DATA_COMPRA,YYYY) SUM(CMPR.PRECO_VENDA) COUNT(*)
    ---------------------------------------- -------------------- ------------------------------ ---------------------- ----------------------
    Jorge Jesus Capas Negras 1997 2600 4
    Jorge Jesus Loja do Mario 1996 650 1
    Jorge Jesus Um Sitio Qualquer 2005 650 1
    Luis Lavoisier Capas Negras 1996 2974 9
    Luis Lavoisier Capas Negras 1997 1300 2
    Luis Lavoisier A Flor do ego 1999 80 1
    Luis Lavoisier A Flor do ego 2000 80 1
    Luis Lavoisier A Flor do ego 2001 650 1
    Luis Lavoisier A Flor do ego 2002 1300 2
    Luis Lavoisier A Flor do ego 2003 650 1
    Luis Lavoisier A Flor do ego 2004 700 1
    Luis Lavoisier A Flor do ego 2005 700 1
    Luis Lavoisier O Cantinho dos PCs 1998 1460 4

    13 rows selected
    Eu ja tentei de enumeras formas para me dar apenas o que tem maior numero de vendas na mesma loja e no mesmo ano... mas nao consegui...
    Alguma sujestao ???
    Desde ja mt obrigado!
     
    Última edição: 5 de Dezembro de 2006
  2. HecKel

    HecKel The WORM

    O que tinhas com o que removi assinalado:
    Código:
     SELECT emp.nome, inst.nome, to_char(cmpr.data_compra,'YYYY'), SUM(cmpr.preco_venda), COUNT(*) 
    FROM empregado emp, instalacao inst, compra cmpr, contrato cont
    WHERE (emp.num = cmpr.num) AND (cont.cod = inst.cod) AND (cont.num = emp.num) 
      AND (cont.ano = to_char(cmpr.data_compra,'YYYY'))
    GROUP BY [COLOR=Blue][S]emp.nome,[/S][/COLOR] inst.nome, to_char(cmpr.data_compra,'YYYY');
    HIPOTESE A)
    Código:
    SELECT emp.nome, inst.nome, to_char(cmpr.data_compra,'YYYY'), [COLOR=Red]AVG([/COLOR]SUM(cmpr.preco_venda)[COLOR=Red])[/COLOR] [COLOR=Red]as total[/COLOR], COUNT(*) 
    FROM empregado emp, instalacao inst, compra cmpr, contrato cont
    WHERE (emp.num = cmpr.num) AND (cont.cod = inst.cod) AND (cont.num = emp.num) 
      AND 
    GROUP BY inst.nome, to_char(cmpr.data_compra,'YYYY');
    Julgo que o AVG não vai fazer absolutamente nada..., mas o problema que eu encontrei foi que agrupaste TANTO por nome de empregado, COMO por nome de empresa COMO por data..., aí o nome de empregado no agrupamento iria fazer com que existissem empregados diferentes.

    HIPOTESE B)
    Código:
    SELECT emp.nome, inst.nome, to_char(cmpr.data_compra,'YYYY'), SUM(cmpr.preco_venda), COUNT(*) 
     FROM empregado emp, instalacao inst, compra cmpr, contrato cont
     WHERE (emp.num = cmpr.num) AND (cont.cod = inst.cod) AND (cont.num = emp.num) 
       AND 
     GROUP BY inst.nome, to_char(cmpr.data_compra,'YYYY');
    Igual ao A) mas sem o AVG

    HIPOTESE C)
    Código:
    SELECT empregado.nome, instituicao.nome, to_char(compra.data_compra,'YYYY'), AVG(SUM(compra.preco_venda)) as total, COUNT(*) 
    FROM empregado inner join compra using(num), 
    instalacao inner join contrato using(cod) inner join empregado using(num)
    WHERE (cont.ano = to_char(cmpr.data_compra,'YYYY'))
    GROUP BY instituicao.nome, to_char(compra.data_compra,'YYYY');
    Este é um pouco diferente do teu..., julgo que ficou o pretendido. Em vez de operação cartesiana fiz inner joins, gosto mais desta forma :P O código fica mais limpo :P

    HIPOTESE D)

    Código:
    SELECT empregado.nome, instituicao.nome, to_char(compra.data_compra,'YYYY'), SUM(compra.preco_venda), COUNT(*) 
    FROM empregado inner join compra using(num), 
    instalacao inner join contrato using(cod) inner join empregado using(num)
    WHERE (cont.ano = to_char(cmpr.data_compra,'YYYY'))
     GROUP BY instituicao.nome, to_char(compra.data_compra,'YYYY');
    Igual ao C) mas sem o AVG

    Espero que ajude em alguma coisa :) Não faço ideia se estão bem, mas a estas horas (depois de algumas horas com SQL do Oracle na faculdade...) é o que se pode arranjar :P

    abraços, HecKel
     
  3. KiKas

    KiKas Power Member

    nenhum desses queries vai dar o resultado pretendido

    ver neste post para um problema semelhante

    http://www.techzonept.com/showthread.php?p=1300698#post1300698
     

Partilhar esta Página