SQL最近的订单?MS SQL

Bud*_*dyn 3 sql sql-server

我只是编写一个查询来查看我的客户客户数据库,并列出他们已经订购了多少订单等.

我正在努力添加到此查询中的是仅向我显示该电子邮件的最新OrderID

有任何想法吗?

这是我的查询

select top 1000 
     BuyerEMail
     ,COUNT(*) HowMany
     ,Name
from Orders 
where 
     Pay != 'PayPal'
group by 
     BuyerEmail
     ,Name
order by 
     HowMany Desc
Run Code Online (Sandbox Code Playgroud)

Rau*_*ian 5

如果您在编写SQL查询时遇到麻烦,请尝试将您的需求分解为单个语句.

首先,您需要已经解决的每位买家的订单数量.

SELECT BuyerEMail
, Name
, COUNT(*) as TotalOrders
FROM Orders
WHERE Pay <> 'PayPal'
GROUP BY BuyerEmail, Name
Order By TotalOrders Desc
Run Code Online (Sandbox Code Playgroud)

现在您想显示每个买家的最新订单.这样的事情会做:

SELECT BuyerEMail
, Name
, MAX(OrderDate) LatestOrder
FROM Orders 
GROUP BY BuyerEmail, Name
Run Code Online (Sandbox Code Playgroud)

接下来,您需要将输出组合为一个语句.如果比较这两个语句,则两个语句按相同的集合(买方和名称)进行分组,因此您可以将其总结为:

SELECT BuyerEMail
, Name
, COUNT(*) as TotalOrders
, MAX(OrderDate) LatestOrder
FROM Orders
WHERE Pay <> 'PayPal'
GROUP BY BuyerEmail, Name
Run Code Online (Sandbox Code Playgroud)

如果您只想计算Pay!='PayPal'的订单,您可以:

SELECT BuyerEMail
, Name
, COUNT(CASE WHEN Pay != 'PayPal' THEN 1 END) as TotalOrders
, MAX(OrderDate) LatestOrder
FROM Orders
GROUP BY BuyerEmail, Name
Run Code Online (Sandbox Code Playgroud)

现在您评论过您还需要最新订单的OrderID.sqlserver 2012+中的Lead()函数可以做,子选择或我更喜欢交叉应用:

SELECT o.*
, OrderID as LastOrderID
, OrderDate as LastOrderDate
FROM (
    SELECT BuyerEMail
    , Name
    , COUNT(*) as TotalOrders
    FROM Orders
    WHERE Pay != 'PayPal'
    GROUP BY BuyerEmail, Name
) o
CROSS APPLY (
    SELECT TOP 1 OrderID, OrderDate
    FROM Orders s
    WHERE s.BuyerEmail = o.BuyerEmail
    ORDER BY OrderDate DESC
) ca
Run Code Online (Sandbox Code Playgroud)

如您所见,如果您将其拆分为较小的逻辑部分,事情会变得更容易.