SQL在select中使用select获取每年的结果

SQL在select中使用select获取每年的结果,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在为我的SQL研究工作northwind数据库,并试图显示每年购买金额最高的客户 在我看来,我需要在选择中进行选择,以获得我正在寻找工作的结果。我正设法为一位客户获得最高数量的订单,但我不能订购,也不能按年份分开 到目前为止,我做到了这一点: select top 1 (count([Order Details].OrderID)) 'NumOfOrders', Customers.CompanyName, year(OrderDate) 'OrderYear' from

我正在为我的SQL研究工作northwind数据库,并试图显示每年购买金额最高的客户

在我看来,我需要在选择中进行选择,以获得我正在寻找工作的结果。我正设法为一位客户获得最高数量的订单,但我不能订购,也不能按年份分开

到目前为止,我做到了这一点:

select top 1 
    (count([Order Details].OrderID)) 'NumOfOrders',
    Customers.CompanyName, year(OrderDate) 'OrderYear'
from 
    [Order Details], Orders, Customers
where 
    [Order Details].OrderID = Orders.OrderID 
    and Orders.CustomerID = Customers.CustomerID 
    and (year(OrderDate) = 1996 or year(OrderDate) = 1997 or year(OrderDate) = 1998)
group by 
    Customers.CompanyName, year(OrderDate)
order by 
    NumOfOrders desc

如果从脚本中删除TOP 1,您将看到所需内容。 但就像戈登说的,你需要提高你的查询能力。 我为您找到了一些链接,您可以查看:

为您准备的示例脚本:

SELECT 
     C.CompanyName
    ,YEAR(O.OrderDate) AS 'OrderYear'
    ,(COUNT(O.OrderID)) AS 'NumOfOrders'
FROM [Order Details] AS OD
INNER JOIN Orders AS O ON OD.OrderID = O.OrderID
INNER JOIN Customers AS C ON O.CustomerID = C.CustomerID
WHERE   YEAR(O.OrderDate) IN(1996,1997,1998)
GROUP BY C.CompanyName
        ,YEAR(O.OrderDate)
ORDER BY 
        C.CompanyName
        ,YEAR(O.OrderDate)
        ,NumOfOrders DESC

如果从脚本中删除TOP 1,您将看到所需内容。 但就像戈登说的,你需要提高你的查询能力。 我为您找到了一些链接,您可以查看:

为您准备的示例脚本:

SELECT 
     C.CompanyName
    ,YEAR(O.OrderDate) AS 'OrderYear'
    ,(COUNT(O.OrderID)) AS 'NumOfOrders'
FROM [Order Details] AS OD
INNER JOIN Orders AS O ON OD.OrderID = O.OrderID
INNER JOIN Customers AS C ON O.CustomerID = C.CustomerID
WHERE   YEAR(O.OrderDate) IN(1996,1997,1998)
GROUP BY C.CompanyName
        ,YEAR(O.OrderDate)
ORDER BY 
        C.CompanyName
        ,YEAR(O.OrderDate)
        ,NumOfOrders DESC

如果我正确理解了您的目标(每年最有价值客户的前1名),那么您可以尝试以下方法:

SELECT  TOP 1 WITH TIES
        t.NumOfOrders, 
        t.CompanyName, 
        t.OrderYear,
        ROW_NUMBER() OVER (PARTITION BY t.OrderYear 
                            ORDER BY t.NumOfOrders DESC ) AS RN
FROM (  SELECT      COUNT(OD.OrderID) AS [NumOfOrders] ,
                    C.CompanyName,
                    YEAR(OrderDate) AS [OrderYear]
        FROM    [Order Details] AS OD 
                    JOIN [Orders] AS O ON OD.OrderID = O.OrderID
                    JOIN Customers AS C ON O.CustomerID = C.CustomerID
        WHERE  YEAR(OrderDate) IN (1996, 1997, 1998)
        GROUP BY C.CompanyName, YEAR(OrderDate)
     ) AS T
ORDER BY RN

如果我正确理解了您的目标(每年最有价值客户的前1名),那么您可以尝试以下方法:

SELECT  TOP 1 WITH TIES
        t.NumOfOrders, 
        t.CompanyName, 
        t.OrderYear,
        ROW_NUMBER() OVER (PARTITION BY t.OrderYear 
                            ORDER BY t.NumOfOrders DESC ) AS RN
FROM (  SELECT      COUNT(OD.OrderID) AS [NumOfOrders] ,
                    C.CompanyName,
                    YEAR(OrderDate) AS [OrderYear]
        FROM    [Order Details] AS OD 
                    JOIN [Orders] AS O ON OD.OrderID = O.OrderID
                    JOIN Customers AS C ON O.CustomerID = C.CustomerID
        WHERE  YEAR(OrderDate) IN (1996, 1997, 1998)
        GROUP BY C.CompanyName, YEAR(OrderDate)
     ) AS T
ORDER BY RN

切勿在
FROM
子句中使用逗号。始终使用正确、明确、标准的
JOIN
语法。您使用的是哪种dbms?(这个查询是特定于产品的。)我不太确定什么是dbms。如果有帮助的话,我将使用Microsoft SQL Server Management Studio。@Arthurpin有您想要的订购方式。你能提供预期的结果吗?你的sql课程真的仍然教授这种不推荐的联接样式吗?如果是这样,我建议你找一门更现代的课程……千万不要在FROM子句中使用逗号。始终使用正确、明确、标准的
JOIN
语法。您使用的是哪种dbms?(这个查询是特定于产品的。)我不太确定什么是dbms。如果有帮助的话,我将使用Microsoft SQL Server Management Studio。@Arthurpin有您想要的订购方式。你能提供预期的结果吗?你的sql课程真的仍然教授这种不推荐的联接样式吗?如果是这样的话,我建议你选择一门更现代的课程……你是对的。我错过了。谢谢你仔细检查,你说得对。我错过了。谢谢你仔细检查。