溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何在MySQL中使用sum函數(shù)

發(fā)布時間:2021-03-18 15:24:03 來源:億速云 閱讀:267 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細講解有關(guān)如何在MySQL中使用sum函數(shù),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

語法分析

SUM([DISTINCT] expr) [over_clause]

  • Returns the sum of expr. If the return set has no rows, SUM() returns NULL. The DISTINCT keyword can be used to sum only the distinct values of expr.

  • If there are no matching rows, SUM() returns NULL.

  • This function executes as a window function if over_clause is present.

上面幾句是MySQL官方文檔的一個功能描述。這里翻譯一下大致的意思是什么。

  • 返回expr表達式的和。如果沒有返回行數(shù),則返回NULL。這里的DISTINCT是為了去掉表達式expr中的重復值。

  • 如果沒有匹配到行,該函數(shù)也返回NULL。

  • 如果設(shè)置了over_clause,則該函數(shù)作為窗口函數(shù)執(zhí)行。對窗口函數(shù)不熟悉的,可以去了解一下MySQL中的窗口函數(shù)。

函數(shù)解釋

在使用該函數(shù)時,我們應(yīng)該思考一下,該函數(shù)是如何統(tǒng)計表達式中的和呢?可能有的程序員會想,這個函數(shù)直接去統(tǒng)計滿足條件中所有行的總和。這么理解其實也沒錯,只是表達的不是很準確或者他不夠真實了解運行原理。
實際上該函數(shù)是根據(jù)匹配行的值,一個一個累加起來的。這里舉個例子,在一個訂單表中滿足條件的有10行數(shù)據(jù),我們需要統(tǒng)計訂單中的總價,sum的初始值是0,在匹配到第一行時,訂單價格是10,此時sum就變成10,匹配到第二行,訂單價格是20,這時候sum就是30。第三行訂單價格是50,這時候sum就是80。按照這種方式依次累加。

行數(shù)訂單價格sum值
第一行10.0010.00
第二行20.0030.00
第三行30.0060.00
第四行40.00100.00
第五行50.00150.00
第...行......
第十行100.00550.00

實例演示

假設(shè)有下面一張表(Delivery),表結(jié)構(gòu)如下:

+-----------------------------+---------+
| Column Name   | Type |
+-----------------------------+---------+
| delivery_id   | int |
| customer_id   | int |
| order_date   | date |
| customer_pref_delivery_date | date |
| order_money   | decimal |
+-----------------------------+---------+

delivery_id 是表的主鍵。

該表保存著顧客的食物配送信息,顧客在某個日期下了訂單,并指定了一個期望的配送日期(和下單日期相同或者在那之后)。如果顧客期望的配送日期和下單日期相同,則該訂單稱為 「即時訂單」,否則稱為「計劃訂單」。
里面有如下數(shù)據(jù):

+-------------+-------------+------------+-----------------------------+-------------+
| delivery_id | customer_id | order_date | customer_pref_delivery_date | order_money |
+-------------+-------------+------------+-----------------------------+-------------+
| 1  | 1  | 2019-08-01 | 2019-08-02   | 1.23 |
| 2  | 5  | 2019-08-02 | 2019-08-02   | 1.01 |
| 3  | 1  | 2019-08-11 | 2019-08-11   | 1.09 |
| 4  | 3  | 2019-08-24 | 2019-08-26   | 1.00 |
| 5  | 4  | 2019-08-21 | 2019-08-22   | 10.00 |
| 6  | 2  | 2019-08-11 | 2019-08-13   | 12.09 |
+-------------+-------------+------------+-----------------------------+-------------+

實例一

統(tǒng)計出該表中所有的訂單總金額。這里就很簡單了,也是我們常用的使用方式,直接sum()參數(shù)填寫某一個列就行了。按照上面的語法規(guī)則應(yīng)該是一個表達式,實際上一列也是一個表達式。

select sum(order_money) from Delivery;

實例二

寫一條 SQL 查詢語句獲取即時訂單所占的百分比, 保留兩位小數(shù)。這個可能就有一點點難度了,因為你很少用這個語法,如果你用過,就會發(fā)現(xiàn)也很簡單。

首先你要理解,既然是查詢某一個類型的占比,肯定就需要統(tǒng)計總和。我們可以分別去統(tǒng)計到訂單總和sum1,然后再去統(tǒng)計即時訂單總和sum1,然后再去統(tǒng)計即時訂單總和sum1,然后再去統(tǒng)計即時訂單總和sum2。然后在相除就可以了。但是這里明確要求一條SQL語句。那該如何解決呢?

這里就需要你深入了解一下sum的運行原理,我們可以設(shè)想我們一行一行的去讀取數(shù)據(jù),然后讓sum一行一行的累計起來,是不是就可以得到sum2的綜合了?至于sum2的綜合了?至于sum2的綜合了?至于sum1肯定很好統(tǒng)計,直接是表中行數(shù)的綜合。

題解方式一:

select round (
 sum(case when order_date = customer_pref_delivery_date then 1 else 0 end) /
 count(*) * 100,
 2
) as immediate_percentage
from Delivery

題解方式二:

select round (
 sum(order_date = customer_pref_delivery_date) /
 count(*) * 100,
 2
) as immediate_percentage
from Delivery

這里當sum表達式滿足條件,返回1,每次讀到滿足的一行數(shù)據(jù),sum都加1,最后數(shù)據(jù)讀完sum也就加完了。因此滿足條件的總條數(shù)就出來了。

關(guān)于如何在MySQL中使用sum函數(shù)就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI