SQL在select中使用select获取每年的结果
我正在为我的SQL研究工作northwind数据库,并试图显示每年购买金额最高的客户 在我看来,我需要在选择中进行选择,以获得我正在寻找工作的结果。我正设法为一位客户获得最高数量的订单,但我不能订购,也不能按年份分开 到目前为止,我做到了这一点: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
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课程真的仍然教授这种不推荐的联接样式吗?如果是这样的话,我建议你选择一门更现代的课程……你是对的。我错过了。谢谢你仔细检查,你说得对。我错过了。谢谢你仔细检查。