2010-12-14 3 views
0

J'ai actuellement cette requête:SQL - confondu avec agrégats

select 
    customers.emailaddress, 
    MAX(orders.orderdate) as "last order" 
from orders 
join customers 
    on orders.customerID = customers.customerID 
group by customers.emailaddress 

Ce qui me donne les e-mails, et la dernière date de commande. Avec la table 'Orders', il y a un champ nommé 'PaymentTotal', comment puis-je l'obtenir en fonction de la valeur retournée par MAX (orders.orderdate)? (ie essaye d'obtenir le montant de la dernière commande par email)

+0

il serait utile de savoir de quel serveur SQL vous parlez. PostgreSQL, Oracle, SQL Server, etc ... – Wolph

+0

Je pense que c'est MS-SQL, c'est emballé avec un panier que nous utilisons ASP (.net) basé (d'où mon hypothèse c'est MS) – Prinzovdarkness

Répondre

3
select c.EmailAddress, om.MaxOrderDate, o.PaymentTotal 
from (
    select CustomerID, MAX(orders.orderdate) as MaxOrderDate 
    from orders 
    group by CustomerID 
) om 
inner join orders o on om.CustomerID = o.CustomerID 
    and om.MaxOrderDate = o.orderdate 
inner join customers c on o.customerID = c.customerID  
+0

J'espère que la date de commande doit être unique par client sinon cela ne retournera pas les résultats attendus. Je me demande quel est le type de la colonne orderdate ... – Jay

+0

La date de commande est datetime. Merci pour votre aide. Alors quelqu'un peut-il décomposer ce qui s'est passé avec la requête ci-dessus? Je voudrais vraiment apprendre pour que je puisse le faire par moi-même la prochaine fois :) – Prinzovdarkness

+0

la sous-requête "om" trouve l'identifiant et la date du client, puis il rejoint la commande et la table client sur cette valeur pour récupérer le client et le total pour cet ordre. – asawyer

Questions connexes