Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:查找表中列值的最高匹配项?_Sql_Sql Server - Fatal编程技术网

SQL:查找表中列值的最高匹配项?

SQL:查找表中列值的最高匹配项?,sql,sql-server,Sql,Sql Server,我试图通过计算菜单项id的出现次数来查找表中最有序的菜单项。 我试过几种不同的方法,但我还是迷路了。这产生了以下错误: 聚合不能出现在WHERE子句中,除非它位于HAVING子句或select列表中包含的子查询中,并且被聚合的列是外部引用 然而,我认为这是我努力实现的目标: SELECT count(itemCode) FROM OrderProcessing WHERE count(itemCode)=max(count(itemCode)) 一、原始查询的修改版本 @DanGuzman

我试图通过计算菜单项id的出现次数来查找表中最有序的菜单项。 我试过几种不同的方法,但我还是迷路了。这产生了以下错误:

聚合不能出现在WHERE子句中,除非它位于HAVING子句或select列表中包含的子查询中,并且被聚合的列是外部引用

然而,我认为这是我努力实现的目标:

SELECT count(itemCode) 
FROM OrderProcessing 
WHERE count(itemCode)=max(count(itemCode))

一、原始查询的修改版本 @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)
二,。用于选择排序最多的项目之一的查询

SELECT top 1 itemCode --, count(*) as MaxCount  --optional
FROM OrderProcessing
GROUP BY itemCode
ORDER BY count(*) DESC

这是另一种方法:

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;
它看起来不太漂亮,但它可以产生更好的执行计划排序,这是一个非常需要资源的子句


即使有多个菜单项同时出现,它也会返回结果。

如果您想要一行,我建议您按以下方式排序:

如果希望所有项目都具有最大数量,请与领带一起使用:

如果你想成为一名花花公子,可以使用窗口函数。以下是一个例子:

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;

我使用此查询查找出现率最高的项目:

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 
此查询用于查找发生率最高的计数:

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 
包含聚合结果的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,销售较少。这不是一个正确的答案。我会和你的分析师或任何要求这个结果的人进一步讨论这个问题。

@DanGuzman,右,TOP1将忽略关系。我现在应该改进解决方案。您的查询只返回最大发生次数,但OP需要这样的项目,请尝试使用此选项从SELECT count中选择MAXcnt*cnt从OrderProcessing GROUP中选择itemCode dt,以获得该点@沙特。非常感谢。