翼度科技»论坛 编程开发 mysql 查看内容

MySQL sum后再计算percentage的多种解决办法

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
over() 函数,最简单的一种

以下是SQL片段,在外面嵌套一个Select是因为over 不会SQL语句所有的data sum,而不是 limit 之后的数据,所以需要先limit 在over()
  1.                 SELECT
  2.                 b.*,
  3.                 ROUND(b.amount*100 / SUM(b.amount) OVER(),2) AS inv_salesShare
  4.                 FROM (       
  5.                                 SELECT
  6.                                         cm_cust_no,
  7.                                         cm_co_name,
  8.                                         SUM ( amount ) AS amount
  9.                                 FROM
复制代码
Cross Join

通过cross join 把total 作为一个结果集并到sum的sql,然后通过除法计算Percentage。
  1. SELECT
  2.      P.PersonID, SUM(PA.Total)
  3.      SUM(PA.Total) * 100 / [p] AS 'Percentage'
  4. FROM
  5.      Person P
  6. JOIN
  7.      Package PA ON P.PersonID = PA.PackageFK
  8. CROSS JOIN
  9.      (SELECT SUM(PA.[Total]) AS [p]
  10.       FROM Package PA) t
  11. GROUP BY
  12.      P.PersonID
复制代码
通过两个Select 嵌套查询

这种方法适合简单Case,如果条件复杂时,第二个Select就会臃肿,比如 增加 时间条件、Group,Limit等。
  1. SELECT PA.PersonID, SUM(PA.Total),
  2.        SUM(PA.Total) * 100.0 / (SELECT SUM(PA.Total) FROM PA)
  3. FROM Package PA
  4. GROUP BY PA.PersonID;
复制代码
通过with 函数处理

此方法简单,分块处理,一些复杂的SQL可以考虑使用with方法处理。
有时间验证下
  1. ;WITH PersonTotals AS
  2. (
  3.   SELECT P.PersonID, SUM(CAST(PA.Total AS MONEY)) Total
  4.   FROM Person P
  5.   JOIN Package PA ON P.PersonID = PA.PackageFK
  6.   GROUP BY P.PersonID
  7. ),
  8. GrandTotal AS
  9. (
  10.   SELECT SUM(PT.Total) Total
  11.   FROM PersonTotals PT
  12. )
  13. SELECT PT.*, (PT.Total / NULLIF((SELECT Total From GrandTotal),0)) * 100 Percentage
  14. FROM PersonTotals PT
复制代码
到此这篇关于MySQL sum后再计算percentage的多种解决办法的文章就介绍到这了,更多相关MySQL计算percentage内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/database/322087j09.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具