我试图通过计算其商品ID的出现次数来查找表中最有序的菜单项。 我尝试了一些不同的东西,但我很丢失。这产生了错误:
"聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。"
然而,我认为这会让我想到我想要实现的目标:
SELECT count(itemCode)
FROM OrderProcessing
WHERE count(itemCode)=max(count(itemCode))
答案 0 :(得分:5)
予。原始查询的修改版本 (@DanGuzman评论关系后的更新)
选择与最想要的项目具有相同计数的所有项目:
SELECT itemCode , count(*) as MaxCount
FROM OrderProcessing
GROUP BY itemCode
HAVING count(*) =
-- count of most wanted item
(select top 1 count(*)
from OrderProcessing
group by itemCode
order by count(*) desc)
II。查询以选择最有序的项目之一
SELECT top 1 itemCode --, count(*) as MaxCount --optional
FROM OrderProcessing
GROUP BY itemCode
ORDER BY count(*) DESC
答案 1 :(得分:3)
如果你想要一行,我会建议order by
:
SELECT TOP 1 itemCode, count(itemCode)
FROM OrderProcessing
GROUP BY itemCode
ORDER BY count(itemCode);
如果您想要所有具有最大数量的项目,请使用WITH TIES
:
SELECT TOP 1 WITH TIES itemCode, count(itemCode)
FROM OrderProcessing
GROUP BY itemCode
ORDER BY count(itemCode);
如果您想要花哨,请使用窗口功能。这是一个例子:
SELECT itemCode, cnt
FROM (SELECT itemCode, count(itemCode) as cnt,
MAX(count(itemCode)) OVER () as maxcnt
FROM OrderProcessing
GROUP BY itemCode
) op
WHERE cnt = maxcnt;
答案 2 :(得分:1)
这是另一种方法:
SELECT OP.itemCode
FROM (
SELECT OP.itemCode, OP.TotalRows, MAX(TotalRows) OVER() AS MaxRows
FROM (
SELECT OP.itemCode, COUNT(*) AS TotalRows
FROM dbo.OrderProcessing AS OP
GROUP BY OP.itemCode
) AS OP
) AS OP
WHERE OP.TotalRows = OP.MaxRows;
它看起来不太漂亮,但它可能会导致更好的执行计划(排序是一个非常耗费资源的条款)。
即使有多个具有相同出现的菜单项,它也应该返回结果。
答案 3 :(得分:1)
我使用此查询来查找出现次数最多的项目:
SELECT t.*
FROM OrderProcessing t
JOIN
(SELECT itemCode, ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) seq
FROM OrderProcessing
GROUP BY itemCode) dt
ON t.itemCode= dt.itemCode
WHERE dt.seq = 1
此查询查找最高发生次数:
SELECT MAX(cnt)
FROM (SELECT COUNT(*) cnt
FROM OrderProcessing
GROUP BY itemCode) dt
答案 4 :(得分:1)
包含聚合结果的where
子句称为having
子句。但是,您无法嵌套聚合函数:Max(Count(*))。
但你可以分层。使用CTE对此有好处:
with
Data( ItemID )as(
select 1 union all
select 2 union all
select 2 union all
select 3 union all
select 3 union all
select 3
),
Sums( ItemID, TotalSold )as(
select ItemID, Count( * )
from Data
group by ItemID
)
select *
from Sums
where TotalSold =(
select Max( TotalSold )
from Sums );
这将显示交易次数最多的所有项目。但是,由于这个问题据称是回答的问题,我认为显示所有联系将是正确的结果。如果物品X和Y都卖得最多,提交物品X作为答案,那么暗示所有其他物品,包括物品Y,卖得少。这不是一个正确的答案。我会与你的分析师或任何要求这个结果的人讨论这个问题。