对此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标记。