2010-10-29 62 views
1

我的數據如下:選擇每個客戶的最後訂單的總和

ORDER_ID CLIENT_ID DATE  VALUE 
     1881 51 2010-07-19 100.17 
     1882 50 2010-07-19 100.17 
     2754 50 2010-07-25 135.27 
     2756 50 2010-07-25 100.28 
     5514 50 2010-07-27 121.76 
     5515 50 2010-07-28 109.59 
     5516 50 2010-07-27 135.29 
     5517 50 2010-07-28 121.77 
     5518 50 2010-07-31 123.15 
     5519 50 2010-07-31 123.16 
     5520 50 2010-07-31 109.62 
     6079 51 2010-07-31 100.33 
     7372 50 2010-07-25 100.27 

我想是到指定初始日期,例如「2010-07-27」,在過濾只記錄或在WHERE子句中的此日期之後;該查詢應該從客戶端50(訂單1881)和客戶端51(訂單5516)獲得最新訂單並將它們相加在一起。我知道這很簡單,我嘗試了一些不同的方式,但找不到正確的道路。我想我今天想的很窄,所以我正在尋求你的幫助。

謝謝。

+0

我真的很感謝您的每一個答案,並希望對您的有益時間表示真誠的感謝。 謝謝。 – 2010-10-29 18:09:06

回答

3

讓我們試試這個:

SELECT CLIENT_ID, SUM(VALUE) 
FROM YourTable 
WHERE DATE >= '7/27/2010' 
GROUP BY CLIENT_ID 

除非我誤讀或誤解你的問題。 :)

編輯:再次

SELECT SUM(VALUE) 
FROM MyTable mt, 
(SELECT CLIENT_ID, MAX([DATE]) AS 'Date' 
FROM MyTable 
GROUP BY CLIENT_ID) AS r 
WHERE mt.CLIENT_ID = r.CLIENT_ID 
AND mt.DATE = r.Date 

編輯:讓我們試試這個,給出的反饋ORDER_ID立足,而不是DATE最後的命令:

SELECT SUM(VALUE) 
FROM MyTable mt, 
(SELECT CLIENT_ID, MAX([ORDER_ID]) AS 'ORDER_ID' 
FROM MyTable 
GROUP BY CLIENT_ID) AS r 
WHERE mt.CLIENT_ID = r.CLIENT_ID 
AND mt.ORDER_ID = r.ORDER_ID 
+0

對不起,我不清楚。您的查詢爲我提供了每個客戶的最後訂單。我想一起總結每一個訂單。 – 2010-10-29 13:52:01

+0

對不起Lynx,我已經更新了應該工作的答案(在本地重新創建表格和數據時)。請讓我知道它是怎麼回事! – JasonA 2010-10-29 14:24:30

+0

@JasonA:作爲一個歡迎來到+1 :)我認爲對於這個例子,你的查詢仍然總結所有來自同一天(5518,5519,5520) – Andomar 2010-10-29 14:52:17

1

您可以使用子查詢過濾訂單對於沒有後才能存在,如:

select sum(t1.value) 
from YourTable t1 
where t1.Client_ID in (50, 51) 
     and t1.Date > '2010-07-27' 
     and not exists 
     (
     select * 
     from YourTable t2 
     where t1.Client = t2.Client 
       and 
       (
        t1.Date < t2.Date 
        or 
        (t1.Date = t2.Date and t1.Order_ID < t2.Order_ID) 
       ) 
     ) 

一個group by並不需要,如果你只選擇總和。

您的評論建議您在2010-07-27之後查找FIRST(最新)訂單。如果是這樣的話,請用子查詢條件:

   (
        t1.Date > t2.Date 
        or 
        (t1.Date = t2.Date and t1.Order_ID > t2.Order_ID) 
       ) 
+0

謝謝,但是這個總和的結果並不是預期的結果。請參閱5518,5519,5520和6079這兩個函數的總和 - 它只能累加5516和1881的訂單。在AND NOT EXISTS之前沒有問題 – 2010-10-29 14:11:22

+0

@Lynx Kepler:編輯:現在如果有多個訂單具有相同的日期,它會選擇最高訂單號,'not exists'用於過濾最新的訂單;如果您想在2010年7月27日之後彙總所有訂單,請將整個條款全部刪除。 – Andomar 2010-10-29 14:18:33

1
SELECT 

SUM 
(
    (SELECT TOP(1) VALUE 
    FROM ORDER 
    WHERE 
    CLIENT_ID=C.CLIENT_ID 
    DATE >= @LBOUND_ORDER_DATE 
    ORDER BY DATE DESC 
) 
) AS TotalLatestOrders 

FROM 

CLIENT C 
+0

不錯,但它只有retu rns來自第一個客戶的最後一個訂單(ORDER_ID = 5516)(CLIENT_ID = 50)。在這種情況下,我必須從每個客戶那裏獲得最後的訂單(50,51 ...) – 2010-10-29 16:43:30

+0

它是相加的相關子程序。它應該只返回一個值,並且該值是每個客戶端最近訂單的值的總和。 – wllmsaccnt 2010-10-29 17:57:48

1

爲什麼1881年和5516?我認爲這個2客戶端的最後一個訂單是5520和6079.下面的 是我的: select( select value,row_number()over(partition by client_id order by order_id desc)as sn from tablename其中date>「2010-7-27」 )T其中SN = 1

+0

客戶51有2個訂單:1881和6079.但只有1881年在'2010-07-27'之前。客戶端50 – 2010-10-29 17:30:58

+0

相同,而不是>你會得到你所需要的。我想我誤解了你的問題。 – trytry 2010-10-30 01:41:27

2

我寧願不使用子查詢,因爲它們可以減緩查詢下來,表變大......

這個怎麼樣:

SELECT SUM(VALUE) AS SumOfOrderValues 
FROM 
    YourTable t 
    INNER JOIN (
     SELECT CLIENT_ID, MAX(ORDER_ID) AS MaxOrderId 
     FROM YourTable 
     WHERE [DATE] >= '2010-07-27' 
     GROUP BY CLIENT_ID 
    ) AS m ON m.MaxOrderId = t.ORDER_ID 

這應該會爲您在某個日期或之後的每個客戶提供最新訂單。然後是特定訂單的值的總和。

+0

嘿Lynx!你刪除標記爲答案,是有原因的? – TexasViking 2010-10-29 20:07:50

+0

+1歡迎來到SO。如果您認爲子查詢很慢,請閱讀執行計劃;大多數「不存在」子句實際上就像是連接一樣運行。 – Andomar 2010-10-29 21:27:07

+0

Thx Andomar,我在看到wllmsaccnt的解決方案後提到了子查詢。 – TexasViking 2010-10-29 22:09:51

相關問題