【问题标题】:Query listing company name and first order date查询上市公司名称及首单日期
【发布时间】:2013-12-27 05:54:29
【问题描述】:

正如标题所说,我正在尝试编写一个查询来显示客户 ID、公司名称和他们的第一个订单日期(列出的最早日期)。我试过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 

任何建议或帮助将不胜感激!

【问题讨论】:

    标签: sql sql-server-2012 filtering


    【解决方案1】:
    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 
    

    【讨论】:

      【解决方案2】:

      此解决方案更加灵活,因为它允许您从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;
      

      【讨论】:

        猜你喜欢
        • 2019-12-10
        • 2010-12-15
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-01
        相关资源
        最近更新 更多