2013-12-09 4 views
0

Как говорится в названии, я пытаюсь написать запрос, который отображает идентификатор клиента, название компании и дату их первого заказа (указана самая ранняя дата). Я пробовал Top 1, но это не сработало. Использование SQL Server 2012.Идентификационный номер компании и дата первого заказа

Select c.CustomerID, CompanyName, top 1 o.OrderDate as 'first order date' 
from Customers c join Orders o on 
c.CustomerID = o.CustomerID 
order by c.CustomerID 

любые предложения или помощь были бы оценены с благодарностью!

ответ

4
select c.CustomerID, CompanyName, MIN(o.OrderDate) as 'first order date' 
from 
    Customers c 
    join Orders o on c.CustomerID = o.CustomerID 
group by c.CustomerID, CompanyName 
order by c.CustomerID 
1

Это решение является более гибким, поскольку он позволяет добавлять любые столбцы из Customers таблицы без также того, чтобы добавить их к GROUP BY:

;WITH x AS 
(
    SELECT CustomerID, OrderDate = MIN(OrderDate) 
    FROM dbo.Orders GROUP BY CustomerID 
) 
SELECT c.CustomerID, c.CompanyName, x.OrderDate 
    FROM dbo.Customers AS c 
    INNER JOIN x ON c.CustomerID = x.CustomerID 
    ORDER BY c.CustomerID; 

Если вы хотите, чтобы другие столбцы из первого порядка тоже, например, сумма заказа, вы можете сделать это, которую вы не можете добавить при использовании GROUP BY, потому что самый дешевый или самый дорогой заказ, например, не обязательно будет соответствовать в первом порядке:

;WITH x AS 
(
    SELECT CustomerID, OrderDate, TotalAmount, /* ...other columns... */ 
    rn = ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY OrderDate) 
    FROM dbo.Orders GROUP BY CustomerID 
) 
SELECT c.CustomerID, c.CompanyName, x.OrderDate, x.TotalAmount /* ...others... */ 
    FROM dbo.Customers AS c 
    INNER JOIN x ON c.CustomerID = x.CustomerID 
    WHERE x.rn = 1 
    ORDER BY c.CustomerID; 
Смежные вопросы