Подтвердить что ты не робот

Самая последняя запись в левом соединении

Предположим, у меня есть следующие 3 таблицы в SqlServer:

Customer (CustomerID, FirstName, LastName)
Address (AddressID, CustomerID, Line1, City, State)
Product (ProductID, CustomerID, Description)

Клиент может иметь несколько адресов доставки и mulitple продуктов.

Что я хотел бы сделать, так это указать количество клиентов для каждого государства, в котором государство определяется самой последней записью адреса. Например, "Сколько клиентов в последний раз получали продукт в каждом государстве?". Поэтому меня не интересуют какие-либо предыдущие адресные записи для Клиента, только самые последние (определенные AddressID).

State | Number of Customers
--------------------------
CA    | 32
GA    | 12
TX    | 0
OH    | 18

Я бы обычно делал что-то вроде:

SELECT a.State, count(c.CustomerID)
FROM Product p
INNER JOIN Customer c ON c.CustomerID = p.CustomerID
LEFT JOIN Address a ON a.CustomerID = c.CustomerID
WHERE p.ProductID = 101
GROUP BY a.State

Однако, поскольку у Клиента может быть несколько Адресов, клиент будет засчитан только в состоянии самой последней записи адреса?

P.S. Вышеприведенное является просто примерным сценарием, позволяющим легко объяснить соединения, которые я пытаюсь достичь, и не отражает фактический дизайн системы.

4b9b3361

Ответ 1

Попробуйте следующее:

SELECT a.State, count(c.CustomerID)
FROM Product p
INNER JOIN Customer c ON c.CustomerID = p.CustomerID
LEFT JOIN Address a ON a.CustomerID = c.CustomerID 
      AND a.AddressID = 
        (
           SELECT MAX(AddressID) 
           FROM Address z 
           WHERE z.CustomerID = a.CustomerID
        )
WHERE p.ProductID = 101
GROUP BY a.State

Ответ 2

Я не вижу, как вы можете это сделать, не имея таблиц Заказы и OrderDetails. В таблице "Заказы" будут указаны CustomerID ShippingDate и ShipToAddressID, а OrderDetails будут иметь идентификатор OrderID и ProductID. Затем вам понадобится вложенный запрос, чтобы определить самый последний заказ (и, следовательно, самый последний адрес), присоедините его к деталям заказа, чтобы получить упорядоченные продукты, а затем отфильтруйте интересующий вас продукт.

Ответ 3

Вы также можете попробовать (при условии, что я правильно помню синтаксис SQLServer):

SELECT state, count(customer_id)
FROM (
    SELECT
        p.customer_id
        , (SELECT TOP 1 State FROM Address WHERE Address.CustomerID = p.CustomerID ORDER BY Address.ID DESC) state
    FROM Product p
    WHERE p.ProductID = 101)
GROUP BY state