Problema na criação de uma query

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
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

Olá a todos, estou precisando realizar uma pesquisa, mas não consigo selecionar os valores desejados.

A tabela possui os campos
  • cod NUMBER,
    data DATE,
    cod_usuario NUMBER,
    cod_categoria NUMBER;
Quando insiro um valor na tabela todos os valores mudam menos o cod_categoria.
Quando realizo a procura eu preciso trazer todos aqueles que tiverem o mesmo cod_categoria mas que possuem as maiores datas.

Exemplo

Selecionar tudo

cod___data____cod_usuario____cod_categoria
 1___30-05-12_______1______________5
 2___31-05-12_______2______________5
 3___01-05-12_______7______________3
 4___01-05-12_______9______________12
 5___02-05-12_______1______________3
Preciso trazer o cod 2,3,5 pelo fato deles terem cod_categoria diferentes e as maiores datas.

Desculpem não deixar mais claro ou num formato melhor....abraços!
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Rafael_Santos escreveu: Preciso trazer o cod 2,3,5 pelo fato deles terem cod_categoria diferentes e as maiores datas.
Você quis dizer 2, 3 e 4? O 4 que tem categoria 12 e a data da linha cod=3 é menor do que a data do cod=5 (ambos com cod_categoria=3)...
Confirmando, em outras palavras: quer ver, para cada cod_categoria, a linha completa cuja data seja a maior?
Em caso de empate faz o quê?

Meu palpite seria isso:

Selecionar tudo

SQL> create table t (cod NUMBER,
  2                  data DATE,
  3                  cod_usuario NUMBER,
  4                  cod_categoria NUMBER);
 
Table created
SQL> insert into t values (1, to_date('30/05/2012', 'DD/MM/YYYY'), 1, 5);
 
1 row inserted
SQL> insert into t values (2, to_date('31/05/2012', 'DD/MM/YYYY'), 2, 5);
 
1 row inserted
SQL> insert into t values (3, to_date('01/05/2012', 'DD/MM/YYYY'), 7, 3);
 
1 row inserted
SQL> insert into t values (4, to_date('01/05/2012', 'DD/MM/YYYY'), 9, 12);
 
1 row inserted
SQL> insert into t values (5, to_date('02/05/2012', 'DD/MM/YYYY'), 1, 3);
 
1 row inserted
SQL> commit;
 
Commit complete
SQL> select max(cod) keep (dense_rank first order by data desc) cod,
  2         max(data) keep (dense_rank first order by data desc) data,
  3         max(cod_usuario) keep (dense_rank first order by data desc) cod_usuario,
  4         cod_categoria
  5    from t
  6   group by cod_categoria;
 
       COD DATA        COD_USUARIO COD_CATEGORIA
---------- ----------- ----------- -------------
         5 2/5/2012              1             3
         2 31/5/2012             2             5
         4 1/5/2012              9            12
SQL> drop table t;
 
Table dropped
Rafael_Santos escreveu: Desculpem não deixar mais claro ou num formato melhor....abraços!
Num próximo tópico tente usar formatação de código colocando entre tags de [ code ] e postando dados de exemplo da tabela junto com o layout e dados de saída esperado do select. Postando de forma completa há uma chance muito maior de obter ajuda na sua pergunta, pois facilita a vida de quem tenta auxiliá-lo.

[]s
Francisco.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Pô, olhando o select vi que postei errado. Quis dizer 2, 4 e 5. Mas o select estava certo. Ou não... rs :mrgreen:
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

Vlew...perfeito =D .... vou dar uma estudada nesse codigo....Funcionou! =D
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

Uma pergunta...existe algum livro para aprender estes truques maneiros? Abração, e mais uma vez obrigado pela ajuda!
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Eu pessoalmente uso diariamente o site tahiti.oracle.com como uma enciclopédia.

Essas são funções agregadas ou analíticas. Elas são semelhantes mas tem propósitos distintos. Geralmente é possível resolver em SQL problemas bastante complexos com funções analíticas, coisas que geralemente são muito trabalhosas e ineficientes de se fazer em PL/SQL ou em outra linguagem procedural.

Sobre as funções First/Last:

http://docs.oracle.com/cd/E11882_01/ser ... ons065.htm

No link abaixo tem uma boa explicação com um exemplo de uso das funções analíticas e agregadas:

http://docs.oracle.com/cd/E11882_01/ser ... #DWHSG8705
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

Essa função funcionaria para junção de tabelas? Por exemplo se eu tivesse que realizar um join em mais 6 tabelas.
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

Eae gente, estou com outro problema, talvez similar... preciso trazer a descricao da fase quando a data na tabela ideia_fase tiver a maior data e preciso trazer a data de inclusão através da tabela ideia_fase quando o cod_fase for igual a 1.

Selecionar tudo

cretae table categoria(
cod NUMBER,
descricao VARCHAR2(30));

insert into categoria values(1,'Amador');


create table ideia(
cod NUMBER,
titulo VARCHAR2(30),
descricao VARCHAR2(4000),
cod_categoria NUMBER,
sigla_divisao VARCHAR2(30));

insert into ideia values(1,'teste','teste',1,'Zoo');


create table vw_usuarios_banco_ideias(
nome VARCHAR2(50),
cod_login VARCHAR2(50));

insert into vw_usuarios_banco_ideias values('Rafael Rodrigues','rafaelr');


create table usuario(
cod NUMBER,
login VARCHAR2(50));

insert into usuario values(1,'rafaelr');


create table usuario_ideia(
cod NUMBER,
data TIMESTAMP(6),
cod_usuario NUMBER,
cod_ideia NUMBER);

insert into usuario_ideia values(1,08/06/12 15:26:54,1,1);


create table fase(
cod NUMBER,
situacao VARCHAR2(30));

insert into fase values(1,'Analise');
insert into fase values(2,'Discussao');
insert into fase values(3,'Planejamento');

create table ideia_fase(
cod NUMBER,
data TIMESTAMP(6),
cod_ideia NUMBER,
cod_fase NUMBER);

insert into ideia_fase values(1,'06/06/12 15:03:02',1,1);
insert into ideia_fase values(2,'07/06/12 17:54:30',1,2);
insert into ideia_fase values(3,'08/06/12 08:22:44',1,3);
Realizei a seguinte query

Selecionar tudo

SELECT i.cod AS "Código",
       i.titulo AS "Titulo",
       SUBSTR(i.descricao,1,250) AS "Descrição",
       vw.nome AS "Autor",
       cat.descricao AS "Categoria",
       fs.situacao AS "Situação",
       i.sigla_divisao AS "Unidade",
       TO_CHAR(ifase2.data,'dd/mm/yyyy') AS "Data de Inclusão"
FROM ideia i, usuario u, vw_usuarios_banco_ideias vw, usuario_ideia ui, ideia_fase ifase, fase fs, categoria cat, ideia_fase ifase2
WHERE i.cod_categoria = cat.cod AND i.cod = ui.cod_ideia AND ui.cod_usuario = u.cod AND u.login = vw.cod_login AND i.cod = ifase.cod_ideia AND ifase.cod_fase = fs.cod AND i.cod = ifase2.cod_ideia AND ifase2.cod_fase = fs.cod AND ui.data = (SELECT MAX(data) FROM usuario_ideia WHERE cod_ideia = ui.cod_ideia) AND ifase.data = (SELECT MAX(data) FROM ideia_fase WHERE cod_ideia = i.cod)
Mas ele retorna a maior Data de Inclusão assim

Selecionar tudo

Código  Titulo	Descrição    Autor    Categoria    Situação    Unidade    Data de Inclusão
  1     Teste    Teste Rafael Rodrigues    1     Planejamento    Zoo        08/06/12
Rafael_Santos
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 72
Registrado em: Sex, 18 Nov 2011 4:51 pm

Galera consegui, alterei a query com sub-select

Selecionar tudo

SELECT i.cod AS "Código",
       i.titulo AS "Titulo",
       SUBSTR(i.descricao,1,250) AS "Descrição",
       vw.nome AS "Autor",
       cat.descricao AS "Categoria",
       fs.situacao AS "Situação",
       i.sigla_divisao AS "Unidade",
       (SELECT TO_CHAR(data,'dd/mm/yyyy') FROM ideia_fase WHERE cod_ideia = i.cod AND cod_fase = 1) AS "Data de Inclusão"
FROM ideia i, usuario u, vw_usuarios_banco_ideias vw, usuario_ideia ui, ideia_fase ifase, fase fs, categoria cat
WHERE i.cod_categoria = cat.cod AND i.cod = ui.cod_ideia AND ui.cod_usuario = u.cod AND u.login = vw.cod_login AND i.cod = ifase.cod_ideia AND ifase.cod_fase = fs.cod AND ui.data = (SELECT MAX(data) FROM usuario_ideia WHERE cod_ideia = ui.cod_ideia) AND ifase.data = (SELECT MAX(data) FROM ideia_fase WHERE cod_ideia = i.cod)
Vlew pela colaboração...abração!
Responder
  • Informação
  • Quem está online

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