none
subqueries RRS feed

  • Pergunta

  • Olá a todos.

    Ainda estou aprendendo sobre subquery e tenho uma dúvida que acho melhor colocar um exemplo:

    create table item (
    cod_item int not null primary key identity(1,1),
    descricao varchar(20)
    )
    go

    create table pedidos (
    numped int not null primary key identity(200,1),
    cod_item int,
    preco numeric(15,2),
    qtde numeric(15,2),
    dtpedido date
    foreign key (cod_item) references item (cod_item)
    )
    go

    insert into item (descricao) values ('banana')
    insert into item (descricao) values ('maca')
    insert into item (descricao) values ('uva')
    insert into item (descricao) values ('pera')
    insert into item (descricao) values ('laranja')
    insert into item (descricao) values ('manga')


    insert into pedidos (cod_item, preco, qtde, dtpedido) values (1,1.25,5,'20120801')
    insert into pedidos (cod_item, preco, qtde, dtpedido) values (2,3.05,5,'20120702')
    insert into pedidos (cod_item, preco, qtde, dtpedido) values (3,2.15,5,'20120515')
    insert into pedidos (cod_item, preco, qtde, dtpedido) values (4,6.20,5,'20120811')
    insert into pedidos (cod_item, preco, qtde, dtpedido) values (5,3.25,5,'20120531')
    insert into pedidos (cod_item, preco, qtde, dtpedido) values (6,6.36,5,'20120421')
    insert into pedidos (cod_item, preco, qtde, dtpedido) values (1,1.15,5,'20120128')
    insert into pedidos (cod_item, preco, qtde, dtpedido) values (1,10.00,5,'20120104')
    insert into pedidos (cod_item, preco, qtde, dtpedido) values (1,5.25,5,'20120309')
    insert into pedidos (cod_item, preco, qtde, dtpedido) values (4,1.25,5,'20120407')
    insert into pedidos (cod_item, preco, qtde, dtpedido) values (5,1.21,5,'20120704')

    --quero pegar o maior preço e a data respectiva do maior preço que seria o pedido 207
    -- como eu poderia fazer isso?

    select descricao, (
                        select MAX(preco)
                        from pedidos
                        where pedidos.cod_item = item.cod_item
                        ) as MaiorPreco,
                        (
                            select MAX(dtpedido)
                            from pedidos
                            where pedidos.cod_item = item.cod_item
                            ) as DataMaiorPreco

    --como posso relacionar essa data com o maior preço?
                        
    from item

    --

    Desde já agradeço a colaboração de todos.

    --


    Rico CS

    segunda-feira, 10 de setembro de 2012 20:02

Respostas

  • Rico.cs,

    neste caso você precisará de um SubSelect sim. Ou de algum outro recurso, como uma CTE (common table expression), por exemplo.

    A partir da estrutura e exemplos que você postou, você pode utilizar uma das formas a seguir:

    Select
      P.dtpedido,
      P2.MaiorPreco,
      I.descricao
    From
      Pedidos P Join (Select MaiorPreco = Max(preco) From Pedidos) P2 on (P.preco = P2.MaiorPreco)
                Left Join item I on (I.cod_item = P.cod_item)

    ou com CTE:

    ;With CTE as
    (Select MaiorPreco = Max(preco) From Pedidos)
    Select
      P.dtpedido,
      C.MaiorPreco,
      I.descricao
    From
      Pedidos P Join CTE C on (P.preco = C.MaiorPreco)
                Left Join item I on (I.cod_item = P.cod_item)


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Roberson Ferreira _ segunda-feira, 10 de setembro de 2012 22:58
    • Marcado como Resposta Rico.cs segunda-feira, 17 de setembro de 2012 15:56
    segunda-feira, 10 de setembro de 2012 22:58

Todas as Respostas

  • boa noite Rico !

    para isto voce não precisa fazer uma subquery, basta fazer o max do valor agrupando por data e expecificar o top 1 conforme abaixo:

    select top 1
    	MAX(Preco),
    	dtpedido	
    		from pedidos
    group by dtpedido
    

    Se não revolver poste novamente sobre o que ocorreu.


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 10 de setembro de 2012 21:34
  • Rico.cs,

    neste caso você precisará de um SubSelect sim. Ou de algum outro recurso, como uma CTE (common table expression), por exemplo.

    A partir da estrutura e exemplos que você postou, você pode utilizar uma das formas a seguir:

    Select
      P.dtpedido,
      P2.MaiorPreco,
      I.descricao
    From
      Pedidos P Join (Select MaiorPreco = Max(preco) From Pedidos) P2 on (P.preco = P2.MaiorPreco)
                Left Join item I on (I.cod_item = P.cod_item)

    ou com CTE:

    ;With CTE as
    (Select MaiorPreco = Max(preco) From Pedidos)
    Select
      P.dtpedido,
      C.MaiorPreco,
      I.descricao
    From
      Pedidos P Join CTE C on (P.preco = C.MaiorPreco)
                Left Join item I on (I.cod_item = P.cod_item)


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Roberson Ferreira _ segunda-feira, 10 de setembro de 2012 22:58
    • Marcado como Resposta Rico.cs segunda-feira, 17 de setembro de 2012 15:56
    segunda-feira, 10 de setembro de 2012 22:58