对此SQL查询进行分组时出现问题

对此SQL查询进行分组时出现问题,sql,sql-server,Sql,Sql Server,因此,我试图找到销售交易数量最多的月份/年份 我目前的查询是: SELECT DATENAME(M, OrderDate) as orderMonth, year(OrderDate) as orderYear, count(SalesOrderID) as orderCount FROM Sales.SalesOrderHeader soh GROUP BY OrderDate HAVING SUM(soh.SalesOrderID) >= ALL ( SEL

因此,我试图找到销售交易数量最多的月份/年份

我目前的查询是:

SELECT
   DATENAME(M, OrderDate) as orderMonth, 
   year(OrderDate) as orderYear, 
   count(SalesOrderID) as orderCount
FROM
   Sales.SalesOrderHeader soh
GROUP BY OrderDate
HAVING SUM(soh.SalesOrderID) >= ALL (
SELECT SUM(SalesOrderID) FROM Sales.SalesOrderHeader
GROUP BY OrderDate
)
但是,如果我在HAVING行上运行所有内容,以便它返回所有列,而不仅仅是最高列,那么它将返回几个月/年和orderCounts的副本。例如,在这个查询中,2011年6月返回了大约30行,每一行的数量介于2到11个orderCounts之间。查询总共返回1124行,其中它应该只返回38行,因为2011-2014年的销售范围是38个月,在这个范围内总共有38个月

我非常确定我需要指定一个每月的群组,并且应该将我的群组BY更改为如下内容:

GROUP BY DATENAME(month, soh.OrderDate), DATENAME(YYYY, soh.OrderDate)

但是我得到一个错误,每个GROUP BY表达式必须至少包含一个非外部引用的列

不确定您使用的是哪种sql语法,但您可以按事务排序并选择最高的记录

SELECT top 1
   DATENAME(M, OrderDate) as orderMonth, 
   year(OrderDate) as orderYear, 
   count(SalesOrderID) as orderCount
FROM
   Sales.SalesOrderHeader soh
Group by orderMonth, orderYear

order by orderCount asc

您的问题是,您是按OrderDate进行聚合,而不是按月份和年份进行聚合。因此,您的查询版本应该如下所示:

SELECT DATENAME(MONTH, OrderDate) as orderMonth, 
       YEAR(OrderDate) as orderYear, 
       COUNT(*) as orderCount
FROM Sales.SalesOrderHeader soh
GROUP BY DATENAME(MONTH, OrderDate), YEAR(OrderDate)
HAVING COUNT(*) >= ALL (SELECT COUNT(*)
                        FROM Sales.SalesOrderHeader soh2
                        GROUP BY DATENAME(MONTH, OrderDate), YEAR(OrderDate)
                       );
但是,没有人会真的这样编写查询。使用TOP和ORDER BY更简单、更高效。与您的查询等价的是:

SELECT TOP (1) WITH TIES DATENAME(MONTH, OrderDate) as orderMonth, 
       YEAR(OrderDate) as orderYear, 
       COUNT(*) as orderCount
FROM Sales.SalesOrderHeader soh
GROUP BY DATENAME(MONTH, OrderDate), YEAR(OrderDate)
ORDER BY orderCount DESC;

如果存在重复项,则这两项都会返回最大值的所有月份。如果要保证结果集中只有一行,请使用SELECT TOP 1而不是SELECT TOP 1 WITH TIES。

SUMSalesOrderID???为什么要计算ID?我现在很幸运地修复了它,但是的,那个总和和我的yearOrderDate都导致了issues@BenWhitely . . . 语法建议使用SQL Server,因此我添加了SQL Server标记。