SQL - клиенты извлечения (1 клиент на строку в наборе результатов) и самая последняя дата заказа для этих клиентов - PullRequest
0 голосов
/ 20 октября 2011

Ниже приведен SQL-запрос для получения списка клиентов.Как вы можете видеть, я добавил строки, помеченные «- ДОБАВЛЕНО» - новое поле, объединение и порядок.Я пытаюсь отобразить одного клиента на строку в моем наборе результатов, но для каждого клиента я хочу отобразить самый последний заказ.Какой лучший способ сделать это?Должен ли я поставить где в моем JOIN или использовать ТОП 1?Я предполагаю, что есть несколько способов, но я хочу сделать его максимально эффективным.

SELECT 
    CONVERT(NVARCHAR(255),client.identifyingnumber) As [Client ID], 
    CONVERT(VARCHAR,client.name) As [Client Name], 
    client.clientid As [Id],
    CONVERT(CHAR(10),[ecom_order].[order_date],101)  -- ADDED
FROM  
    client 
    JOIN clientstatus ON client.clientstatusid = clientstatus.clientstatusid 
    JOIN clienttype ON clienttype.clienttypeid = client.clienttypeid 
    -- keep left outer join since some clients won't have any orders, thus no last order
    LEFT OUTER JOIN [ecom_order] ON client.clientid = [ecom_order].clientid -- ADDED
WHERE  
    client.name LIKE '%_%' 
    AND 
    client.name <= (
        SELECT MAX(maxsubquery.ordercolumn) FROM (
            SELECT 
                TOP 10 client.name AS ordercolumn 
            FROM  
                client 
                JOIN clientstatus ON client.clientstatusid = clientstatus.clientstatusid 
                JOIN clienttype ON clienttype.clienttypeid = client.clienttypeid 
            WHERE  
                client.name LIKE '%_%' 
            ORDER BY client.name
        ) 
        AS maxsubquery)
 ORDER BY 
    client.name,
    [ecom_order].order_date DESC -- ADDED

Пример набора результатов испытаний:

enter image description here

1 Ответ

2 голосов
/ 20 октября 2011

Попробуйте это

   SELECT 
        CONVERT(NVARCHAR(255),client.identifyingnumber) As [Client ID], 
        CONVERT(VARCHAR,client.name) As [Client Name], 
        client.clientid As [Id],
      -- Change to get latest
        CONVERT(CHAR(10),Max([ecom_order].[order_date]),101)       
     FROM  client 
        JOIN clientstatus ON client.clientstatusid = clientstatus.clientstatusid 
        JOIN clienttype ON clienttype.clienttypeid = client.clienttypeid 
        -- keep left outer join since some clients won't have any orders, 
     -- thus no last order
        LEFT OUTER JOIN [ecom_order] ON client.clientid = [ecom_order].clientid 
    WHERE  
        client.name LIKE '%_%' 
        AND 
        client.name <= (
            SELECT MAX(maxsubquery.ordercolumn) FROM (
                SELECT 
                    TOP 10 client.name AS ordercolumn 
                FROM  
                    client 
                    JOIN clientstatus ON client.clientstatusid = clientstatus.clientstatusid 
                    JOIN clienttype ON clienttype.clienttypeid = client.clienttypeid 
                WHERE  
                    client.name LIKE '%_%' 
                ORDER BY client.name
            ) 
            AS maxsubquery)
     GROUP BY client.identifyingnumber,client.name,client.client_id
     ORDER BY 
        client.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...