2013-12-09 138 views
0

正如标题所说,我试图编写一个显示客户ID,公司名称和第一个订单日期(列出的最早日期)的查询。我尝试了前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; 
相关问题