2011-10-17 84 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)