Sql-Server

如何獲得欄位的總和並避免內部連接的重複?

  • April 12, 2022

我正在從 Accounts 表中提取 Geo,並根據名稱為“Brinks%”的帳戶按 Opportunity $$ Amt 對 Geos 進行排名。

賬戶是獨一無二的,每個賬戶都有很多機會。我需要從帳戶表中添加每個 Geo 的員工人數,但由於每個 Geo 有很多機會,我得到的數字是錯誤的。它似乎正乘以與之相關的機會數量。我需要更改我的加入嗎?我要添加子查詢嗎?我試過了,但我不認為我做得對。這是我寫的:

Select 

Ac.frm_GEO__c, sum(Op.Amount) Amt
,Rank () Over (Order By sum(Op.Amount) Desc) as 'Rank'
,sum(ac.NumberOfEmployees) num_empl

FROM Account Ac
Inner Join Opportunity Op on Op.AccountId=Ac.Id

Where Ac.Name like  'Brinks%' 

Group by Ac.frm_GEO__c

我的結果如下所示。除了最後一列之外,一切都是正確的。

在此處輸入圖像描述

我會用一個子查詢來解決這個問題。我認為這將是您可以使用的最佳路線。一旦您加入,您就已將結果擴展到機會的粒度。永遠不要擴展到這種粒度,而是從子查詢中檢索計數會更容易:

Select 

Ac.frm_GEO__c, [SummarizedOpportunity].Amt
,Rank () Over (Order By [SummarizedOpportunity].Amt Desc) as 'Rank'
,sum(ac.NumberOfEmployees) num_empl

FROM Account Ac
JOIN (SELECT [Opportunity].[AccountId], [Amt] = SUM([Opportunity].[Amount]) FROM [Opportunity] GROUP BY [Opportunity].[AccountId]) [SummarizedOpportunity]
ON [SummarizedOpportunity].[AccountId] = Ac.Id


Where Ac.Name like  'Brinks%' 

Group by Ac.frm_GEO__c

引用自:https://dba.stackexchange.com/questions/310860