2010-10-29 63 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

相关问题