Select

在選擇中的計算中使用 count() 和 sum()

  • October 8, 2014

我試圖在一次選擇中執行以下操作。我們有一個包含公司記錄和使用者記錄的 SAAS。AUserCompany( Company.CompanyId = User.CompanyId) 的成員。在使用者記錄中,我們跟踪該使用者(當月)的頻寬使用情況。

我需要做一個選擇,為我提供每個使用者使用超過 1GB 頻寬的所有公司。我可以使用以下公司獲得這家公司:

select count(*) as numUsers, 
 sum(BandwidthThisMonth) as totalBandwidth 
from [User] 
where [User].CompanyId = @CompanyId

這種方法的問題是我必須先獲取每個公司的 CompanyId,然後一個一個地提取這些數據。而且我只需要找到使用量超過1GB/使用者的情況,這種情況很少見。

有沒有辦法做這樣的事情:

select 
 CompanyId, 
 count(*) as numUsers, 
 sum(BandwidthThisMonth) as totalBandwidth 
from Company, [User] 
where totalBandwidth - (numUsers*1000000000))/1000000000 > 0

count()&sum()僅針對使用者記錄在哪裡User.CompanyId = Company.CompanyId

GROUP BY並且該HAVING子句就是您要查找的內容。GROUP BY 允許您使用聚合函式,而不必像目前那樣只有 1 行數據。在這裡,我們將計算所有使用者的數量以及該公司所有使用者的總頻寬。我不太明白你的臨界點,所以那裡的邏輯可能是錯誤的。我想我將其解讀為“我們在所有這些使用者之間共享 1GB 的數據”

HAVING 類似於我們的 WHERE,但對 GROUPed BY 數據進行操作。在這裡,我指定我只想要總頻寬超過 1GB 的行。

除非您需要 Company 表中的某些內容,否則沒有真正的理由將它們添加到查詢中,因為您的所有數據都在 User 記錄中。

SELECT
   U.CompanyId
,   COUNT(*) as numUsers
,   SUM(U.BandwidthThisMonth) as totalBandwidth 
FROM 
   Company C
   INNER JOIN
       [User] U
       ON U.CompanyId = C.CompanyId
GROUP BY
   U.CompanyId
HAVING
   -- this assumes storage vendor math and not true GB
   -- As a consumer, I'd expect 1GB of bandwidth to be 1 073 741 824
   SUM(U.BandwidthThisMonth) > 1000000000;

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