选择每个客户的最后一个订单的总和

时间:2010-10-29 13:43:18

标签: sql sql-server sql-server-2005 group-by sum

我的数据如下:

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)获得最新订单并将它们加在一起。我知道这很简单,我尝试了一些不同的方法,但找不到合适的路径。我想我今天想的很窄,所以我求助于你。

谢谢。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

这应该在特定日期或之后为每个客户提供此最新订单。然后是特定订单的值的总和。

答案 2 :(得分: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)
                )

答案 3 :(得分: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

答案 4 :(得分:1)

为什么1881和5516?我认为这个2客户的最后一个订单是5520和6079。 下面是我的: 从中选择总和(值) 选择值,row_number()over(由order_id desc按client_id顺序分区)为sn 从 tablename where date&gt; '2010-7-27' )其中sn = 1