我只是编写一个查询来查看我的客户客户数据库,并列出他们已经订购了多少订单等.
我正在努力添加到此查询中的是仅向我显示该电子邮件的最新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)
如果您在编写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)
如您所见,如果您将其拆分为较小的逻辑部分,事情会变得更容易.
| 归档时间: |
|
| 查看次数: |
271 次 |
| 最近记录: |