2011-10-17 83 views
0

我如何根据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

+0

你的代码有什么问题?什么不工作? –

+0

@Joe Stefanelli它工作正常,但返回所有行。我希望它只返回基于firmid的最大计数的行。 –

回答

0

编辑返回回记载:SQL 2005的答案被删除。

然后,你可以把你的结果到一个临时表(或表变量),做这样的事情...

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

或者......

SELECT 
    * 
FROM 
    TempTable 
INNER JOIN 
    (SELECT FirmID, MAX(ValueCount) AS ValueCount FROM TempTable GROUP BY FirmID) AS lookup 
    ON lookup.FirmID  = TempTable.FirmID 
    AND lookup.ValueCount = TempTable.ValueCount 

这些会给如果任何ValueCount与另一个FirmID相关联,则记录多个记录。因此,你可以试试这个...

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

不能编译。它是我们从数据迁移过来的旧的sql2000服务器 –

0

对于这个问题,你需要生成结果集的查询,以确定最大ValueCount,则需要再次进行查询拉刚记录与Max ValueCount。您可以通过多种方式来完成此操作,例如将主要查询重复为子查询,并在SQL Server 2005/2008中使用CTE。我认为使用子查询会变得有点麻烦,而且更喜欢CTE,但对于SQL Server 2000,您不会将其作为选项。所以,我用了临时表而不是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 
0

您应该能够使用派生表如下:

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 
0

TBL1和TBL2是您的查询:

SELECT * FROM TBL1 WHERE TBL1.ValueCount =( SELECT MAX(TBL2.ValueCount)FROM TBL2 WHERE TBL2.FIRMID = TBL1.FIRMID)