如果您在编写SQL查询时遇到困难,请尝试将需求分解成单个语句。
首先,您需要每个买家的订单数量,这已经得到解决。
SELECT BuyerEMail
, Name
, COUNT(*) as TotalOrders
FROM Orders
WHERE Pay <> 'PayPal'
GROUP BY BuyerEmail, Name
Order By TotalOrders Desc
现在你想要显示每个买家的最新订单。可以使用以下代码实现:
SELECT BuyerEMail
, Name
, MAX(OrderDate) LatestOrder
FROM Orders
GROUP BY BuyerEmail, Name
下一步,你需要将输出组合成一个语句。如果你比较这两个语句,它们都是按相同的集合(买家和名称)分组的,所以你可以总结为:
SELECT BuyerEMail
, Name
, COUNT(*) as TotalOrders
, MAX(OrderDate) LatestOrder
FROM Orders
WHERE Pay <> 'PayPal'
GROUP BY BuyerEmail, Name
如果您只想计算付款方式不为“PayPal”的订单数量,可以执行以下操作:
SELECT BuyerEMail
, Name
, COUNT(CASE WHEN Pay != 'PayPal' THEN 1 END) as TotalOrders
, MAX(OrderDate) LatestOrder
FROM Orders
GROUP BY BuyerEmail, Name
现在你提到你还想获取最新订单的订单ID。在SQLServer 2012+中,可以使用Lead()函数、子查询或者我更喜欢使用Cross Apply:
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
正如您所看到的,如果将其分解为更小的逻辑部分,则事情变得更加容易。