View Full Version : problema sql (sql server 2000)


alfinete
11-10-2007, 01:01
SELECT TabPedido.IdUtilizador, TabPedido.IdProduto, TabPedido.DataHora, TabPedido.Quantidade, TabPedido.Estado, TabProduto.Nome, TabProduto.Stock,
TabPedido.Codigo, TabUtilizador.Nome AS Expr1
FROM TabPedido INNER JOIN
TabProduto ON TabPedido.IdProduto = TabProduto.Id INNER JOIN
TabUtilizador ON TabPedido.IdUtilizador = TabUtilizador.Id
WHERE (TabPedido.Estado = 2)

este select esta a seleccionar tdos os pedidos com estado = 2 mostrando o utilizador que o aceitou.

mas:

eu quero mostrar tb o utilizador que o fez, tenho te ir ver do pedido com o mesmo codigo deste anterior , mas com estado = 0, e queria fazer isso tdo no mesmo query

ex:

pedido:ex de 2 registos


codigo estado utilizador
1 0 alf
1 2 alf2
o
pedido com estado = 0 foi pedido pelo utilziador alf e aceite pelo utilizador alf 2 e guardado com estado 2.

eu no select quero mostrar os dois utilizadorea

so sei que para isso tenho o mesmo codigo nos dois pedidos de estados diferentes .


gostava de saber como

obrigado

SoundSurfer
11-10-2007, 10:53
Podes fazer um Inner Join dessa query toda com outra igual com o estado a 0.

alfinete
11-10-2007, 17:16
agradeço a ajuda mas nãi estou a conseguir

agradecia que desses um exemplo de como

alfinete
11-10-2007, 18:44
melhor explicando o problema

SELECT TabPedido.IdUtilizador, TabPedido.IdProduto, TabPedido.DataHora, TabPedido.Quantidade, TabPedido.Estado, TabProduto.Nome, TabProduto.Stock,
TabPedido.Codigo, TabUtilizador.Nome AS Expr1
FROM TabPedido INNER JOIN
TabProduto ON TabPedido.IdProduto = TabProduto.Id INNER JOIN
TabUtilizador ON TabPedido.IdUtilizador = TabUtilizador.Id
WHERE (TabPedido.Estado = 2) ________

explicando o caso

tenho uma tabela pedidos com os campos e seguintes registos


idproduto idutlizador datahora quantidade codigo estado
1 2 x x 1 0
1 3 x x 1 2


como pode ver nos registos que dei no exemplo temos 2 registos com o mesmo codigo
pois são referentes ao mesmo produto , mas com utilizadores diferentes isto porque:

o registo de estado =0 é referente ao utilizador que fez o pedido
e o registo de estado = 2 é referente ao utilizador que o aceitou

o select a cima so mostra o utilizador que o aceitou, e eu quero que mostre tambem o utilizador
que o fez

este select(enviado) mostra a query



datahora quantidade produto stock utilizador
(pedido aceite) (que aceitou)


o tipo o query que eu quero que apareça é





datahora | datahora | produto | codigo|quantidade | utilizador | utilizador
(pedidofeito) | (pedidoaceite) | | | que aceitou | quepedio
(estado2) |(estado=0)


em relação a query anterior quero que contenha também o campo quantidade

gostava de uma ajuda para o caso

obrigado aguardo atenciosamente

ricgodi
11-10-2007, 19:34
n sei se percebi bem a tua questao.

o k keres sao o utilizador k tem o estado = 0 e o utilizador com estado=2 em k o idproduto=1 nos dois?

se for isso basta alterar o fim de

where (tabpedido.estado = 2)

para

where (tabpedido.estado in (0,2))

alfinete
12-10-2007, 01:21
de qq das maneira obrigado

esta aqui a solução so para pedidos de estado = 0 e de estado = 2


select distinct
/* select o nome de quem aceitou o pedido*/
c.Nome as Aprovador,
/*select o nome de quem fez o pedido*/
d.Nome as Requisitante,
/*select codigo do pedido*/
a.Codigo,
/*select o nome do produto*/
e.Nome as Produto,
/*select a datahora do pedido requisitado*/
f.Datahora as 'Data Req',
/*select a datahora do pedido entregue*/
a.Datahora as 'Data ent',
/*select a quantidade pedida no pedido requisitado*/
g.quantidade as 'quant req',
/*select a quantidade pedida no pedido aceite*/
a.quantidade as 'quant aceit',
/*quantidade pendente*/


from TabPedido a
/* capta o codigo do pedido referente a estado em b e select a*/
Left Join TabPedido b
on a.codigo=b.codigo
Left Join TabPedido pend
on a.codigo=pend.codigo
/* capta o o nome do utilizador que aceitou o pedido com estado em a e select c*/
Left Join TabUtilizador c
on a.IdUtilizador=c.Id
/* capta o nome do utilizador que requisitou o pedido */
Left Join TabUtilizador d
on b.IdUtilizador=d.Id
/* capta o o produto */
Left Join TabProduto e
on b.IdProduto=e.Id
/* capta a datahora do pedido estado 0 */
Left Join Tabpedido f
on b.datahora=f.datahora
/* capta a quantidade do pedido estado 0 */
left join Tabpedido g
on b.quantidade=g.quantidade


/*a para estado = 2
b para estado = 0*/
where a.estado=2
and b.estado=0


assim funciona mostrando tdo em relação a pedidos requisitados e entregues

mas se que quizer fazer tb para pendentes

e fazendo assim

[CODE]

select distinct
/* select o nome de quem aceitou o pedido*/
c.Nome as Aprovador,
/*select o nome de quem fez o pedido*/
d.Nome as Requisitante,
/*select codigo do pedido*/
a.Codigo,
/*select o nome do produto*/
e.Nome as Produto,
/*select a datahora do pedido requisitado*/
f.Datahora as 'Data Req',
/*select a datahora do pedido entregue*/
a.Datahora as 'Data ent',
/*select a quantidade pedida no pedido requisitado*/
g.quantidade as 'quant req',
/*select a quantidade pedida no pedido aceite*/
a.quantidade as 'quant aceit',
/*quantidade pendente*/

h.quantidade as 'quant pendente'
from TabPedido a
/* capta o codigo do pedido referente a estado em b e select a*/
Left Join TabPedido b
on a.codigo=b.codigo
Left Join TabPedido pend
on a.codigo=pend.codigo
/* capta o o nome do utilizador que aceitou o pedido com estado em a e select c*/
Left Join TabUtilizador c
on a.IdUtilizador=c.Id
/* capta o nome do utilizador que requisitou o pedido */
Left Join TabUtilizador d
on b.IdUtilizador=d.Id
/* capta o o produto */
Left Join TabProduto e
on b.IdProduto=e.Id
/* capta a datahora do pedido estado 0 */
Left Join Tabpedido f
on b.datahora=f.datahora
/* capta a quantidade do pedido estado 0 */
left join Tabpedido g
on b.quantidade=g.quantidade

left join Tabpedido h
on pend.quantidade=h.quantidade
/*a para estado = 2
b para estado = 0*/
where a.estado=2
and b.estado=0
and pend.estado=1






ele mes mostra os pendentes mas so os que são >0

se pendente for =0 não mostra e eu quero que mostre

gostava de resolver apenas este problemita

obrigada

SoundSurfer
12-10-2007, 10:36
Como no problema anterior, tens de fazer o left join dos pendentes à tabela "a" e "b" e ficares com, por exemplo apend. e bpend.