Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server 2008 选择一列中具有最大值的行_Sql Server 2008_Max - Fatal编程技术网

Sql server 2008 选择一列中具有最大值的行

Sql server 2008 选择一列中具有最大值的行,sql-server-2008,max,Sql Server 2008,Max,我有一个select语句,返回两列:办公室名称和每个办公室的总数: select o.OfficeName, c.Total from Offices o left join ( select OfficeID, count(*) Total from Customers c group by OfficeID ) c on o.OfficeID = c.OfficeID where o.ClusterID = 29 如何获取具有最大总计的行? “Customers”表有一个“OfficeID

我有一个select语句,返回两列:办公室名称和每个办公室的总数:

select o.OfficeName, c.Total
from Offices o
left join
( select OfficeID, count(*) Total
from Customers c
group by OfficeID
) c on o.OfficeID = c.OfficeID
where o.ClusterID = 29
如何获取具有最大总计的行?
“Customers”表有一个“OfficeID”列。对于给定的“ClusterID”,我选择集群内由集群id(例如29)标识的所有办公室,并统计属于这些办公室的客户。

有多种方法:

SELECT TOP 1 o.OfficeName, c.Total
  FROM Offices o
  LEFT JOIN
    (SELECT OfficeID, count(*) Total
       FROM Customers c
      GROUP BY OfficeID
    ) c ON o.OfficeID = c.OfficeID
 WHERE o.ClusterID = 29
 ORDER BY c.Total DESC
SELECT  OfficeName, Total
FROM    (   SELECT  o.OfficeName, c.Total, MAX(Total) OVER() [MaxTotal]
            FROM    Offices o
                    LEFT JOIN
                    (   SELECT  OfficeID, COUNT(*) Total
                        FROM    Customers
                        GROUP BY OfficeID
                    ) c 
                        ON o.OfficeID = c.OfficeID
            WHERE   o.ClusterID = 29
        ) c
WHERE   Total = MaxTotal

WITH CTE AS
(   SELECT  o.OfficeName, c.Total
    FROM    Offices o
            LEFT JOIN
            (   SELECT  OfficeID, COUNT(*) Total
                FROM    Customers
                GROUP BY OfficeID
            ) c 
                ON o.OfficeID = c.OfficeID
    WHERE   o.ClusterID = 29
)
SELECT  *
FROM    CTE
WHERE   Total = (SELECT MAX(Total) FROM CTE)
SELECT  TOP 1 o.OfficeName, c.Total
FROM    Offices o
        LEFT JOIN
        (   SELECT  OfficeID, COUNT(*) Total
            FROM    Customers
            GROUP BY OfficeID
        ) c 
            ON o.OfficeID = c.OfficeID
WHERE   o.ClusterID = 29
ORDER BY Total DESC

WITH CTE AS
(   SELECT  o.OfficeName, c.Total
    FROM    Offices o
            LEFT JOIN
            (   SELECT  OfficeID, COUNT(*) Total
                FROM    Customers
                GROUP BY OfficeID
            ) c 
                ON o.OfficeID = c.OfficeID
    WHERE   o.ClusterID = 29
)
SELECT  *
FROM    CTE
WHERE   Total = (SELECT MAX(Total) FROM CTE)
SELECT  TOP 1 o.OfficeName, c.Total
FROM    Offices o
        LEFT JOIN
        (   SELECT  OfficeID, COUNT(*) Total
            FROM    Customers
            GROUP BY OfficeID
        ) c 
            ON o.OfficeID = c.OfficeID
WHERE   o.ClusterID = 29
ORDER BY Total DESC

虽然使用TOP 1可能不是您想要的,但使用其他方法,如果有两个办公室拥有相同数量的客户,它们都将被返回,而TOP 1将只返回其中的一个(可能按照办公室名称的顺序)。如果您只需要一条记录,那么这是最好的方法。

有多种方法:

SELECT  OfficeName, Total
FROM    (   SELECT  o.OfficeName, c.Total, MAX(Total) OVER() [MaxTotal]
            FROM    Offices o
                    LEFT JOIN
                    (   SELECT  OfficeID, COUNT(*) Total
                        FROM    Customers
                        GROUP BY OfficeID
                    ) c 
                        ON o.OfficeID = c.OfficeID
            WHERE   o.ClusterID = 29
        ) c
WHERE   Total = MaxTotal

WITH CTE AS
(   SELECT  o.OfficeName, c.Total
    FROM    Offices o
            LEFT JOIN
            (   SELECT  OfficeID, COUNT(*) Total
                FROM    Customers
                GROUP BY OfficeID
            ) c 
                ON o.OfficeID = c.OfficeID
    WHERE   o.ClusterID = 29
)
SELECT  *
FROM    CTE
WHERE   Total = (SELECT MAX(Total) FROM CTE)
SELECT  TOP 1 o.OfficeName, c.Total
FROM    Offices o
        LEFT JOIN
        (   SELECT  OfficeID, COUNT(*) Total
            FROM    Customers
            GROUP BY OfficeID
        ) c 
            ON o.OfficeID = c.OfficeID
WHERE   o.ClusterID = 29
ORDER BY Total DESC

WITH CTE AS
(   SELECT  o.OfficeName, c.Total
    FROM    Offices o
            LEFT JOIN
            (   SELECT  OfficeID, COUNT(*) Total
                FROM    Customers
                GROUP BY OfficeID
            ) c 
                ON o.OfficeID = c.OfficeID
    WHERE   o.ClusterID = 29
)
SELECT  *
FROM    CTE
WHERE   Total = (SELECT MAX(Total) FROM CTE)
SELECT  TOP 1 o.OfficeName, c.Total
FROM    Offices o
        LEFT JOIN
        (   SELECT  OfficeID, COUNT(*) Total
            FROM    Customers
            GROUP BY OfficeID
        ) c 
            ON o.OfficeID = c.OfficeID
WHERE   o.ClusterID = 29
ORDER BY Total DESC

虽然使用TOP 1可能不是您想要的,但使用其他方法,如果有两个办公室拥有相同数量的客户,它们都将被返回,而TOP 1将只返回其中的一个(可能按照办公室名称的顺序)。如果您只想要一条记录,那么这是最好的方法

与领带一起
提供了一种更干净的方法,让所有办公室共享最高计数:

with a as (
    select o.OfficeID,Total=COUNT(*)
    from Offices o
    inner join Customers c on c.OfficeID=o.OfficeID
    group by o.OfficeID
)
select top 1 WITH TIES t.OfficeName, a.Total
from a
inner join Offices t on t.OfficeID=a.OfficeID
where t.ClusterID=29
order by a.Total desc

WITH TIES
提供了一种更干净的方式,让所有办公室共享最高计数:

with a as (
    select o.OfficeID,Total=COUNT(*)
    from Offices o
    inner join Customers c on c.OfficeID=o.OfficeID
    group by o.OfficeID
)
select top 1 WITH TIES t.OfficeName, a.Total
from a
inner join Offices t on t.OfficeID=a.OfficeID
where t.ClusterID=29
order by a.Total desc

史蒂文和@GarethD,谢谢你。我没有考虑两个或更多办公室可能拥有相同数量客户的情况。这可能发生在我的情况下,我想显示所有的答案;他们都对吗?史蒂文和@GarethD,谢谢。我没有考虑两个或更多办公室可能拥有相同数量客户的情况。这可能发生在我的情况下,我想显示所有的答案;他们都对吗?