SQL最近的订单?MS SQL
我只是写一个查询,看看我的客户数据库,并列出他们有多少订单等 我努力添加到这个查询中的是只显示该电子邮件的最新OrderID 有什么想法吗 这是我的问题SQL最近的订单?MS SQL,sql,sql-server,Sql,Sql Server,我只是写一个查询,看看我的客户数据库,并列出他们有多少订单等 我努力添加到这个查询中的是只显示该电子邮件的最新OrderID 有什么想法吗 这是我的问题 select top 1000 BuyerEMail ,COUNT(*) HowMany ,Name from Orders where Pay != 'PayPal' group by BuyerEmail ,Name order by HowMany Desc
select top 1000
BuyerEMail
,COUNT(*) HowMany
,Name
from Orders
where
Pay != 'PayPal'
group by
BuyerEmail
,Name
order by
HowMany Desc
试试这个:
SELECT
BuyerEMail
,COUNT(*) HowMany
,Name
FROM Orders O
JOIN (Select Max(OrderDate) LastOrder, BuyerEmail From Orders Group By BuyerEmail) R On R.BuyerEmail = O.BuyerEmail
WHERE
Pay != 'PayPal'
GROUP BY
BuyerEmail
,Name
ORDER BY
HowMany Desc
试一试,
SELECT TOP 1000
o.BuyerEMail
,COUNT(*) HowMany
,o.Name
,o2.OrderID
FROM Orders o
JOIN
(
SELECT
BuyerEmail
,MAX(OrderDate) Latest
FROM Orders
GROUP BY BuyerEmail
) l
ON o.BuyerEmail = l.BuyerEmail
JOIN Orders o2
ON l.BuyerEmail = o2.BuyerEmail
AND l.OrderDate = o2.OrderDate
WHERE Pay != 'PayPal'
GROUP BY
o.BuyerEmail
,o.Name
,l.Latest
ORDER BY
COUNT(*) DESC
它通过子查询中的每个电子邮件地址计算出最新订单,然后您可以在选择中使用它。我还为表格添加了别名,使事情变得更简单
你也可以用另一种方法,嵌套子查询
SELECT TOP 1000
o.BuyerEMail
,COUNT(*) HowMany
,o.Name
,o2.OrderID
FROM Orders o
JOIN
(
SELECT
BuyerEmail
,OrderID
FROM
Orders ord
JOIN
(
SELECT
BuyerEmail
,MAX(OrderDate) Latest
FROM Orders
GROUP BY BuyerEmail
) ma
ON ord.BuyerEmail = ma.BuyerEmail
AND ord.OrderDate = ma.OrderDate
) l
ON o.BuyerEmail = l.BuyerEmail
WHERE Pay != 'PayPal'
GROUP BY
o.BuyerEmail
,o.Name
,l.Latest
ORDER BY
COUNT(*) DESC
如果您的表有一个日期或日期时间字段,您可以按此字段desc排序,这样您就可以查看最近的订单,否则,如果您的表中没有任何日期字段,但不是它,而是一个增量id,您的字段在增加,只有插入,您也可以将主键用作desc。
如果您没有数据字段,我强烈建议您使用表中的数据字段。如果您在编写sql查询时遇到问题,请尝试将您的需求分解为单个语句 首先,您需要每个买家的订单数量,您已经解决了这个问题
SELECT BuyerEMail
, Name
, COUNT(*) as TotalOrders
FROM Orders
WHERE Pay <> 'PayPal'
GROUP BY BuyerEmail, Name
Order By TotalOrders Desc
接下来,需要将输出合并到一条语句中。如果比较这两个语句,则它们都按相同的集合(买方和名称)分组,因此可以将其总结为:
SELECT BuyerEMail
, Name
, COUNT(*) as TotalOrders
, MAX(OrderDate) LatestOrder
FROM Orders
WHERE Pay <> 'PayPal'
GROUP BY BuyerEmail, Name
现在,您还需要最新订单的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
正如你所看到的,如果你把它分成更小的逻辑部分,事情就会变得更容易。如果我理解正确的话,也许是这样的事情
;with cte as (
select BuyerEMail, lastOrderId = Max(OrderId)
from Orders
group by BuyerEMail
),
cte1 as (
select BuyerEMail, ordersCount = count(*)
from orders
where ( pay != 'paypal' )
group By BuyerEMail
)
select
a.lastOrderId, a.BuyerEMail, b.ordersCount
from
cte as a
inner join cte1 as b on ( a.BuyerEMail = b.BuyerEMail )
这取决于您如何定义最近的订单?您的表中有日期吗?是的,我们有OrderDate列。我也在考虑使用FirstOrDefault,但您不能使用SQL…您有带买家列表的表吗?请分享相关表的结构、一些示例数据、预期输出以及您在尝试解决此问题时遇到的问题。你帮我们的越多,我们能帮的就越准确。提示:在您的示例中,N是1。这可以正常工作,但我不想显示OrderDate,而是想显示它附带的OrderID。我已尝试将其添加到该联接中,但出现错误。。我需要一个单独的连接来添加最新日期的OrderID吗?可以,也可以嵌套另一个子查询。我已经更新了我的答案,加入到订单表(o2)以带回此信息。如果在订单日期中有一个datetime字段,这将是最有效的。这一个字段为您排序了吗?它有效吗谢谢:)很抱歉响应太晚,我正在重命名列:)
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
;with cte as (
select BuyerEMail, lastOrderId = Max(OrderId)
from Orders
group by BuyerEMail
),
cte1 as (
select BuyerEMail, ordersCount = count(*)
from orders
where ( pay != 'paypal' )
group By BuyerEMail
)
select
a.lastOrderId, a.BuyerEMail, b.ordersCount
from
cte as a
inner join cte1 as b on ( a.BuyerEMail = b.BuyerEMail )