Select
在選擇中的計算中使用 count() 和 sum()
我試圖在一次選擇中執行以下操作。我們有一個包含公司記錄和使用者記錄的 SAAS。A
User
是Company
(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;