MySQL sum后再計(jì)算percentage的多種解決辦法
over() 函數(shù),最簡單的一種
以下是SQL片段,在外面嵌套一個(gè)Select是因?yàn)閛ver 不會(huì)SQL語句所有的data sum,而不是 limit 之后的數(shù)據(jù),所以需要先limit 在over()
SELECT b.*, ROUND(b.amount*100 / SUM(b.amount) OVER(),2) AS inv_salesShare FROM ( SELECT cm_cust_no, cm_co_name, SUM ( amount ) AS amount FROM
Cross Join
通過cross join 把total 作為一個(gè)結(jié)果集并到sum的sql,然后通過除法計(jì)算Percentage。
SELECT P.PersonID, SUM(PA.Total) SUM(PA.Total) * 100 / [p] AS 'Percentage' FROM Person P JOIN Package PA ON P.PersonID = PA.PackageFK CROSS JOIN (SELECT SUM(PA.[Total]) AS [p] FROM Package PA) t GROUP BY P.PersonID
通過兩個(gè)Select 嵌套查詢
這種方法適合簡單Case,如果條件復(fù)雜時(shí),第二個(gè)Select就會(huì)臃腫,比如 增加 時(shí)間條件、Group,Limit等。
SELECT PA.PersonID, SUM(PA.Total), SUM(PA.Total) * 100.0 / (SELECT SUM(PA.Total) FROM PA) FROM Package PA GROUP BY PA.PersonID;
通過with 函數(shù)處理
此方法簡單,分塊處理,一些復(fù)雜的SQL可以考慮使用with方法處理。
有時(shí)間驗(yàn)證下
;WITH PersonTotals AS ( SELECT P.PersonID, SUM(CAST(PA.Total AS MONEY)) Total FROM Person P JOIN Package PA ON P.PersonID = PA.PackageFK GROUP BY P.PersonID ), GrandTotal AS ( SELECT SUM(PT.Total) Total FROM PersonTotals PT ) SELECT PT.*, (PT.Total / NULLIF((SELECT Total From GrandTotal),0)) * 100 Percentage FROM PersonTotals PT
到此這篇關(guān)于MySQL sum后再計(jì)算percentage的多種解決辦法的文章就介紹到這了,更多相關(guān)MySQL計(jì)算percentage內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql數(shù)據(jù)庫鎖定機(jī)制詳細(xì)介紹
這篇文章主要介紹了Mysql數(shù)據(jù)庫鎖定機(jī)制詳細(xì)介紹,本文用大量內(nèi)容講解了Mysql中的鎖定機(jī)制,例如MySQL鎖定機(jī)制簡介、合理利用鎖機(jī)制優(yōu)化MySQL等內(nèi)容,需要的朋友可以參考下2014-12-12mysql中關(guān)于between和in的區(qū)別
這篇文章主要介紹了mysql中關(guān)于between和in的區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07mysql使用報(bào)錯(cuò)1142(42000)的問題及解決
這篇文章主要介紹了mysql使用報(bào)錯(cuò)1142(42000)的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08解決MySQL報(bào)錯(cuò)1267 - Illegal mix of coll
這篇文章主要給大家介紹了解決MySQL報(bào)錯(cuò)1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPL的問題,文中有詳細(xì)的解決方案,需要的朋友可以參考下2023-09-09