我的数据如下:
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 :(得分: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