Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL最近的订单?MS SQL_Sql_Sql Server - Fatal编程技术网

SQL最近的订单?MS SQL

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

我只是写一个查询,看看我的客户数据库,并列出他们有多少订单等

我努力添加到这个查询中的是只显示该电子邮件的最新OrderID

有什么想法吗

这是我的问题

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 )