Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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/7/sql-server/26.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,如何根据firmid检索每个ValueCount的最大值。我需要这样输出数据 我的代码在下面 SELECT F.FirmID, F.Name, DL.ValueId, DL.ValueName, count(DL.ValueName) AS ValueCount FROM dbo.Jobs AS J INNER JOIN DimensionValues AS DV ON DV.CrossRef = J.JobId INNER JOIN dbo.DimensionLists AS

如何根据firmid检索每个ValueCount的最大值。我需要这样输出数据

我的代码在下面

SELECT
 F.FirmID,
 F.Name,
 DL.ValueId,
 DL.ValueName,
 count(DL.ValueName) AS ValueCount
 FROM 
dbo.Jobs AS J
 INNER JOIN DimensionValues AS DV ON
DV.CrossRef = J.JobId
 INNER JOIN dbo.DimensionLists AS DL ON
DV.ValueId = DL.ValueId
 INNER JOIN Firms AS F ON
F.FirmId =  J.ClientFirmId
 WHERE
DL.DimensionId = 4
  GROUP BY
F.FirmID,
F.Name,
DL.ValueName,
DL.ValueId
这会产生类似于

firmid | value | count
1        1       5
1        2       10
2        3       1
2        1       6
我需要把10和6的记录还给你

编辑:SQL 2005答案已删除

然后你可以将结果放入一个临时表或表变量中,然后做如下操作

SELECT
  *
FROM
  TempTable
WHERE
  ValueCount = (SELECT MAX(ValueCount) FROM TempTable AS Lookup WHERE FirmID = TempTable.FirmID)
或者

如果任何ValueCount与同一个FirmID的另一个ValueCount绑定,则这些将提供多条记录。因此,你可以试试这个

SELECT
  *
FROM
  TempTable
WHERE
  value = (
            SELECT TOP 1
              value
            FROM
              TempTable as lookup
            WHERE
              FirmID = TempTable.FirmID
            ORDER BY
              ValueCount DESC
          )

对于这个问题,您需要生成查询的结果集以确定Max ValueCount,然后需要再次执行查询以仅提取具有Max ValueCount的记录。您可以通过多种方式执行此操作,例如将主查询作为子查询重复,以及在SQLServer2005/2008中使用CTE。我认为使用子查询会有点混乱,并且更喜欢CTE,但是对于SQLServer2000,您没有选择CTE。所以,我用了一个临时表而不是CTE。我运行它一次以获取MaxValueCount并将其保存到一个临时表中,然后再次运行查询并对临时表进行连接以仅获取MaxValueCount记录

create table #tempMax
(
    FirmID int,
    MaxValueCount int
)

insert #tempMax
SELECT t.FirmID, MAX(t.ValueCount) AS MaxValueCount
  FROM (
SELECT F.FirmID, F.Name, DL.ValueId, DL.ValueName
     , count(DL.ValueName) AS ValueCount
  FROM dbo.Jobs AS J
 INNER JOIN DimensionValues AS DV ON DV.CrossRef = J.JobId
 INNER JOIN dbo.DimensionLists AS DL ON DV.ValueId = DL.ValueId
 INNER JOIN Firms AS F ON F.FirmId =  J.ClientFirmId
 WHERE DL.DimensionId = 4 
 GROUP BY F.FirmID, F.Name, DL.ValueName, DL.ValueId) t

SELECT t.FirmID, t.Name, t.ValueID, t.ValueName, t.ValueCount
  FROM (
SELECT F.FirmID, F.Name, DL.ValueId, DL.ValueName
     , count(DL.ValueName) AS ValueCount
  FROM dbo.Jobs AS J
 INNER JOIN DimensionValues AS DV ON DV.CrossRef = J.JobId
 INNER JOIN dbo.DimensionLists AS DL ON DV.ValueId = DL.ValueId
 INNER JOIN Firms AS F ON F.FirmId =  J.ClientFirmId
 WHERE DL.DimensionId = 4 
 GROUP BY F.FirmID, F.Name, DL.ValueName, DL.ValueId) t
 INNER JOIN #tempMax m ON t.FirmID = m.FirmID and t.ValueCount = m.MaxValueCount

DROP TABLE #tempMax

您应该能够为此使用派生表:

SELECT  F.FirmID, 
        F.Name, 
        DL.ValueId, 
        DL.ValueName, 
        T.ValueCount    

FROM    Jobs J
        INNER JOIN DimensionValues DV
            ON DV.Crossref = J.JobID
        INNER JOIN DimensionList DL
            ON DV.ValueID = DL.ValueID
        INNER JOIN Firms F
            ON F.FirmID = J.ClientFirmID

        --derived table
        INNER JOIN (SELECT FirmID, MAX(ValueName) ValueCount FROM DimensionList GROUP BY FirmID) T
            ON T.FirmID = F.FirmID

WHERE  DL.DimensionId = 4 

TBL1和TBL2是您的查询:

挑选* 来自TBL1 哪里
TBL1.ValueCount=从TBL2中选择MAXTBL2.ValueCount,其中TBL2.FIRMID=TBL1.FIRMID

您的代码有什么问题?什么不起作用?@Joe Stefanelli它工作正常,但返回所有行。我希望它只返回基于firmid的最大计数的行。该行不可编译。我们正在从一台旧的sql2000服务器迁移数据
SELECT  F.FirmID, 
        F.Name, 
        DL.ValueId, 
        DL.ValueName, 
        T.ValueCount    

FROM    Jobs J
        INNER JOIN DimensionValues DV
            ON DV.Crossref = J.JobID
        INNER JOIN DimensionList DL
            ON DV.ValueID = DL.ValueID
        INNER JOIN Firms F
            ON F.FirmID = J.ClientFirmID

        --derived table
        INNER JOIN (SELECT FirmID, MAX(ValueName) ValueCount FROM DimensionList GROUP BY FirmID) T
            ON T.FirmID = F.FirmID

WHERE  DL.DimensionId = 4