Usuário com melhor resposta
subqueries

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
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.brSe 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
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.
- Sugerido como Resposta Alexandre Matayosi segunda-feira, 10 de setembro de 2012 21:37
-
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.brSe 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