Navicat 部落格

在 SQL Server 中計算平均每日計數 2020 年 11 月 20 日,由 Robert Gravelle 撰寫

計算平均每日計數似乎是經常會做的事情,但是我從未做過。我問我的妻子是否有這樣做過,她也是資料庫支援的應用程式的程式設計人員,而她也從來沒有機會這樣做!因此,我今天懷着熱誠迎接了這一個挑戰。

要界定什麼是「平均每日計數」,對於本篇文章而言,它說明在醫生辦公室的每月患者數目,一個月內生產的小部件數目或一個月內出售的產品數目。然後通過將每月計數除以一個月中的天數來計算每日平均值,以便我們知道每日計數對每月總數的貢獻。例如,如果一家汽車經銷商在 5 月份銷售了 10 輛本田喜美,那麼這 10 輛交易就意味著平均每天銷售量為 0.32 輛。同時,如果經銷商要在一個月內售出多達 50 輛本田喜美,那麼每日平均銷售量將升至每天 1.61 輪本田思域。

查詢

我們的 SELECT 陳述式將查詢 Sakila 範例資料庫,以以下格式列出每個月的電影租借量:

ID| MONTH | MONTHLY_COUNT | AVG_DAILY_COUNT 
------------------------------------------- 
 1| Jan   | 152           | 10.3 
 2| Jan   | 15000         | 1611 
 3| Jan   | 14255         | 2177 
 1| Feb   | 4300          | 113 
 2| Feb   | 9700          | 782 
 3| Feb   | 1900          | 97 
etc... 

上面的 AVG_DAILY_COUNT 欄增加了查詢的複雜性,因為我們需要首先取得每月的計數。因此,查詢由內部和外部 SELECT 陳述式組成。以下是內部查詢和以年、月和 ventory_id 排序的結果:

inner_query (150K)

外部查詢

從這些資料,我們可以以表列方式列出平均每日計數:

outer_query (165K)

我將每個月的天數包括在內以作參考,因為它在計算每日平均值中起著關鍵作用。這也很有啟發性,因為需要每個月天數才能計算出平均每日計數,因此如何獲得一個月的天數也很有趣。這是與查詢的其餘部分分割出來的程式碼:

datediff(day, 
         datefromparts(rental_year, rental_month, 1), 
         dateadd(month, 1, datefromparts(rental_year, rental_month, 1))) days_in_month

datediff() 函式傳回每月第一天至下個月第一天之間的天數。datefromparts() 函式使用內部查詢的 rental_year 和 rental_month 欄建立一個日期。

我們可以在 daily_avg 的計算中看到相同的程式碼:

round(
    cast(cnt as FLOAT) / cast(datediff(day, 
                              datefromparts(rental_year, rental_month, 1), 
                              dateadd(month, 1, datefromparts(rental_year, rental_month, 1))) as FLOAT
                         ), 4
) daily_avg

請注意,被除數(cnt)和除數(月的天數)都必須轉換為 FLOAT。否則,小數將在計算中被捨棄。我們希望盡可能地保持精確度在四捨五入至四個小數位數。

總結

在今天的文章中,我們使用 Navicat for SQL Server 計算了 SQL Server 中特定欄的平均每日計數。如果你對 Navicat for SQL Server 感興趣,可以免費試用 14 天!

Navicat 文章
頻道記錄
分享
部落格封存檔