SóProvas


ID
606208
Banca
CESGRANRIO
Órgão
FINEP
Ano
2011
Provas
Disciplina
Banco de Dados
Assuntos

As tabelas a seguir compõem a base de dados de uma livraria

LIVRO (COD LIVRO,PREC_UNIT,CAT)
VENDA (NUM VENDA,COD_LIVRO,DATA,QTD)
COD_LIVRO REFERENCIA LIVRO

Considere as seguintes informações sobre essa base de dados:

- As chaves primárias foram sublinhadas, e as chaves estrangeiras foram definidas através da cláusula REFERENCIA.
- A tabela LIVRO possui uma linha para cada título disponível no catálogo da livraria. Nela são registrados a categoria (CAT) e o preço unitário (PREC_UNIT) dos livros a venda.
- Uma linha da tabela VENDA representa uma venda realizada pela livraria. Cada venda se refere a um único livro, que é identificado através da chave estrangeira COD_LIVRO. Além disso, a tabela VENDA registra a data na qual a venda foi realizada e a quantidade de exemplares vendida. Logo, o valor de uma venda é o produto de QTD e PREC_UNIT.
- O gerente dessa livraria solicitou que fosse disponibilizada uma consulta que listasse os códigos dos livros cujos valores médios de venda fossem superiores aos valores médios de venda de todos os livros da categoria 2 (CAT=2).

Qual comando SQL irá retornar corretamente as informações solicitadas por esse gerente?

Alternativas
Comentários
  • Não entendi essa questão, pois como pode ser a letra C se having só existe se tiver o group by.

    O having é o where do group by.

    Ordem de apresentação
    Select
    From
    Where
    group by
    having // having só existe se tiver group by.
    order by

    Alguém saberia me explicar.
  • Boa noite Pessoal,

    Tambem não entendi a quest ão , alguem poderia explicar? 
  • HAVING pode existir sem GROUP BY sim. Alguns bancos de dados aceitam, como é o caso do PostgreSQL.
  •  Phelipe,

    A QUESTÃO NÃO FEZ MENÇÃO DO USO DO POSTGRES, ENTÃO, SE TRATA DE UMA EXCEÇÃO E ESTA FOGE A REGRA.

    O MODELO HAVING DEFAULT NÃO EXIGE A ESPECIFICAÇÃO, PORTANTO, A REGRA É O SQL ANSI, PODENDO A QUESTÃO SER PASSÍVEL DE ANULAÇÃO, POIS DEIXA MARGEM A AMBIGÜIDADE. 

    PS.: A ALTERNATIVA B e C SÃO IGUAIS NESTA QUESTÃO, SERÁ SE É ISSO MESMO ?
  • Segue a opção C, retirada da prova.

    (C) SELECT L.COD_LIVRO
    FROM VENDA V,LIVRO L
    WHERE L.COD_LIVRO=V.COD_LIVRO
    GROUP BY L.COD_LIVRO
    HAVING AVG(V.QTD*L.PREC_UNIT) > (SELECT AVG(V.QTD*L.PREC_UNIT)
    FROM VENDA V,LIVRO L
    WHERE L.COD_LIVRO=V.COD_LIVRO AND L.CAT=2)

    Já estava achando que a estava doidão e viajando quando vi a B e C, conferi umas 3 três vezes.
    Agora sim a resposta faz sentido e está correta.

  • Pessoal, a letra C tá certa mesmo, a questão tem o Group by, portanto sem problemas para usar o Having.
    Agora a letra B não tem o "Group by" por isso está errada.
  • Porque não pode ser letra A)?
  •       Bom, o GROUP BY irá agrupar os valores; e a função HAVING é uma condição lógica que deve ser acompanhada do GROUP BY que irá delimitar esses valores que serão agrupados. Por isso não pode ser a letra A.
  • Acredito que a questão possua duas respostas. a letra A e a letra C
  • Glaucio,
    não se pode usar funções agregadas dentro do "where" como no exemplo da A:
    WHERE L.COD_LIVRO=V.COD_LIVRO AND AVG(V.QTD*L.PREC_UNIT) >
  • O padrão ANSI é 

    SELECT column_name [, aggregate_function(column_name)]
    FROM table_name
    [WHERE column_name operator value]
    GROUP BY column_name
    HAVING aggregate_function(column_name) operator value

  • Segue o script para testar no BD.

    create table LIVRO (COD_LIVRO number ,PREC_UNIT number ,CAT number, primary key (COD_LIVRO));

    create table VENDA (NUM_VENDA number ,COD_LIVRO number,DATA date,QTD number, primary key (NUM_VENDA), foreign key (COD_LIVRO) REFERENCES LIVRO (COD_LIVRO));

    insert into livro values (1,2,2);

    insert into livro values (2,5,2);

    insert into livro values (3,8,1);

    insert into livro values (4,9,1);

    insert into livro values (5,12,2);

    insert into livro values (6,16,2);

         

    insert into venda values (1,1,'24-01-2014',5);

    insert into venda values (2,2,'24-01-2014',1);

    insert into venda values (3,3,'24-01-2014',4);

    insert into venda values (4,4,'24-01-2014',6);

    insert into venda values (5,5,'24-01-2014',9);

    insert into venda values (6,6,'24-01-2014',8);

    insert into venda values (7,6,'24-01-2014',5);

    insert into venda values (8,3,'24-01-2014',4);