SELECT TOP record for each year

前端 未结 3 1382
天涯浪人
天涯浪人 2021-01-14 10:18

I am trying to recap on my sql skill, now I am trying to run a simple query on northwinddb to show me the top customer for each year, but as soon as I use the TOP function o

相关标签:
3条回答
  • 2021-01-14 10:59

    Three steps: first sum quantities grouped by company and year, then order the results by quantity, then filter first row by group only.

    ; WITH sums as (
       SELECT C.Companyname, YEAR(O.OrderDate) AS Year, sum (Quantity) Total
         FROM Customers C JOIN Orders O
        ON C.CustomerID = O.CustomerID JOIN [Order Details] OD
        ON O.OrderID = OD.OrderID
        group by C.Companyname, YEAR(O.OrderDate)
    )
    with ordering as (
       select Companyname, Year, Total,
              row_number() over (partition by CompanyName, Year order by Total desc) rownum
          from sums
    )
    select *
    from ordering
    where rownum = 1
    
    0 讨论(0)
  • 2021-01-14 11:05

    You can do this bit more compactly in SQL Server 2008 as follows:

    select top (1) with ties
      C.CompanyName,
      Year(O.OrderDate) as Yr,
      sum(OD.Quantity) as Total
    from Orders as O
    join Customers as C on C.CustomerID = O.CustomerID
    join "Order Details" as OD on OD.OrderID = O.OrderID
    group by C.CompanyName, Year(O.OrderDate)
    order by 
      row_number() over (
        partition by Year(O.OrderDate)
        order by sum(OD.Quantity) desc
      );
    
    0 讨论(0)
  • 2021-01-14 11:08

    Thank you for the help. I found a way that allows me to change the number of top customers i want to see for each year. By using Sub queries and Row_Number

    SELECT CompanyName
    ,yr
    ,Total
    FROM(SELECT CompanyName
    , yr
    , Total
    , ROW_NUMBER() OVER(PARTITION BY yr ORDER BY yr, Total DESC) AS RowNumber
    FROM(SELECT DISTINCT CompanyName
        , YEAR(O.OrderDate) AS yr
        ,  SUM(OD.Quantity) OVER(PARTITION BY CompanyName
                                , YEAR(O.OrderDate)) As Total
        FROM Customers C JOIN Orders O
            ON C.CustomerID = O.CustomerID JOIN [Order Details] OD
            ON O.OrderID = OD.OrderID) Tr)Tr2
    Where RowNumber <= 1
    
    0 讨论(0)
提交回复
热议问题