2016-05-19 135 views
3

我只是寫一個查詢來查看我的客戶客戶數據庫,並列出他們已經做了多少個訂單等。SQL最近訂單? MS SQL

我在努力添加到這個查詢中是隻顯示我最近的OrderID for該電子郵件

任何想法?

這裏是我的查詢

select top 1000 
    BuyerEMail 
    ,COUNT(*) HowMany 
    ,Name 
from Orders 
where 
    Pay != 'PayPal' 
group by 
    BuyerEmail 
    ,Name 
order by 
    HowMany Desc 
+3

這取決於你如何定義最近的訂單?你的桌子上有日期嗎? –

+0

是的,我們有OrderDate列。我也沒有考慮做FirstOrDefault,但是你不能在SQL中... – Budyn

+0

你有買家名單嗎? –

回答

1

給這個一展身手;

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中使用它。我還用別名來簡化表格。

你也可以通過嵌套子查詢來做到這一點;

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 
+0

這可以工作,但不是顯示訂單日期,而是想顯示隨訂單日期排列的訂單ID。我已經嘗試將它添加到該JOIN,但得到一個錯誤..我需要一個單獨的加入從最新的日期添加OrderID? – Budyn

+0

你可以耶,或者你可以嵌套另一個子查詢。我已經用另一個連接更新了我的答案到訂單表(o2)以恢復此信息。如果您在訂購日期有日期時間字段,這將最好。 –

+0

這個人爲你分類嗎? –

0

試試這個:

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 
0

如果你的表有一個日期或日期時間字段,你可以通過這個字段遞減順序,因此你要查看最新的訂單,否則,如果您沒有任何日期字段在表中,但不是它有一個增量id,並且你的字段正在增加,並且只有插入,你可以使用你的主鍵作爲desc。 如果您沒有任何人,我強烈建議您在表格中使用數據字段。

5

如果您在編寫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 

如果您只想計算其支付的訂單=「貝寶」 ,你可以這樣做:

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+可以做,子查詢或者我如何喜歡交叉應用:

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 

正如你所看到的,事情變得更容易,如果你在較小的邏輯部分分裂它。

0

也許這樣的話,如果我理解正確嗎?

;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)