выберите сумму последнего заказа каждого клиента - PullRequest
1 голос
/ 29 октября 2010

Мои данные выглядят следующим образом:

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», чтобы фильтровать только записи в или после этой даты вГДЕ оговорка;запрос должен получить последний заказ от клиента 50 (заказ 1881) и клиента 51 (заказ 5516) и суммировать их вместе.Я знаю, что это просто, и я пытался разными способами, но не смог найти правильный путь.Я думаю, что сегодня я думаю о том, чтобы ограничиться, поэтому я обращаюсь к вам за помощью.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 29 октября 2010

Давайте попробуем:

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
2 голосов
/ 29 октября 2010

Я бы предпочел не использовать подзапрос, поскольку они могут замедлить запрос по мере увеличения таблицы ...

как насчет этого:

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

Это должно дать вам этот последний заказ для каждого клиента в или после определенной даты. Затем сумма значений для конкретных заказов.

1 голос
/ 29 октября 2010

почему 1881 и 5516?Я думаю, что последним заказом для этого 2 клиента являются 5520 и 6079. ниже мое: выберите сумму (значение) из (выберите значение, row_number () более (разделить по порядку client_id по порядку_порядка_диска) как sn из имени таблицы, где дата> '2010-7-27 ') Т, где sn = 1

1 голос
/ 29 октября 2010
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
1 голос
/ 29 октября 2010

Вы можете использовать подзапрос для фильтрации заказов, для которых более поздний заказ не существует, например:

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

A group by не требуется, если вы выбираете только сумму.

Вашкомментарий предполагает, что вы ищете ПЕРВЫЙ (не последний) заказ после 2010-07-27.В этом случае замените условие подзапроса на:

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