您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(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ù)時,我們應(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.00 | 10.00 |
第二行 | 20.00 | 30.00 |
第三行 | 30.00 | 60.00 |
第四行 | 40.00 | 100.00 |
第五行 | 50.00 | 150.00 |
第...行 | ... | ... |
第十行 | 100.00 | 550.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)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(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)容。