获取列总和并用于计算总数的百分比(mySQL)
Posted
技术标签:
【中文标题】获取列总和并用于计算总数的百分比(mySQL)【英文标题】:Get column sum and use to calculate percent of total (mySQL) 【发布时间】:2015-05-28 14:14:31 【问题描述】:这是我的桌子的一个非常基本的外观。我有第 1 列和第 2 列,需要生成第 3 列。第 3 列只是所有Name
的Number
列的总和除以给定行的Number
。
| Name | Number | % of total |
| ------------- |:-------------:| -----: |
| Bob | 5 | 25 |
| Sally | 10 | 50 |
| John | 5 | 25 |
我正在努力解决如何获取数字行的总数并将其用作计算其余部分的值。
编辑:如果可能,我希望将其作为单个查询而不是两个单独的查询来执行。
【问题讨论】:
你事先有第二列的总和吗? @SalmonKiller 不,我不知道。这是棘手的部分(对我来说)。尝试获取该值,然后在一个查询中使用它。 【参考方案1】:您只需要CROSS JOIN
SUM()
的Number
列:
SELECT Name, Number, Number * 100 / t.s AS `% of total`
FROM mytable
CROSS JOIN (SELECT SUM(Number) AS s FROM mytable) t
Demo Here
【讨论】:
这对我有用...谢谢!一个问题。如果我想添加一个WHERE
子句(例如WHERE name="Bob"
),那会放在哪里?我试图把它放在FROM mytable
之后,但出现错误。
@jonmrich 这取决于您要过滤的内容。是应用SUM
的行吗?然后你必须在CROSS JOIN
的SELECT
中进行操作。否则,WHERE
必须放在 CROSS JOIN
之后。
你可以想象,我的实际表比这复杂得多。我有多个具有相同名称的列(代表同一个人),我需要将每个实例加在一起(例如 Bob 的总数)并将其除以 Number
列的总数。这就是我想挂断电话的地方。
@jonmrich 我认为this 可能是您正在寻找的。span>
谢谢...我在正确的地方使用了一些 group by
和 where
。【参考方案2】:
如果我这样做,我会首先存储一个保存总数的变量,如下所示:
SET @total := (SELECT SUM(number) FROM myTable);
一旦我有了这个变量,我就可以运行一个查询来获取每一行的百分比,如下所示:
SELECT name, number, (number / @total) * 100 AS percentage
FROM myTable;
如果您不想使用变量,您可以将该子查询移到您的 select 语句中:
SELECT name, number, (number / (SELECT SUM(number) FROM myTable)) * 100 AS percentage
FROM myTable;
以下是每种方法的 SQL Fiddle 示例。
【讨论】:
我从未使用过存储变量。它存储多长时间?我可以重写它吗?我需要在单独的查询中运行这些吗?很多问题... @jonmrich 如果我没记错的话,它们是单独运行的,我现在在您的编辑中看到您可能不希望这样做。我相信它在存储过程中更有用。至于它的存储时间,我不确定。它可能只是您当前的部分 知道了……知道未来的好事情,即使它不适用于这里。 需要明确的是,mysql 中的 @variable 会持续您的连接期限,并且是该连接的本地变量。因此,如果您连接、设置变量,然后使用该变量继续运行查询,则不会有问题。此外,如果您有多个连接,所有设置和使用相同的变量名称,它们都有自己的“副本”,并且不会在另一个连接上更新/更改相同的变量。 感谢您的澄清,开发者!【参考方案3】:您可以通过子选择获得它:
SELECT Name, Number, Number * 100 / (select sum(Number) FROM MYTABLE) AS '% of total'
FROM mytable
【讨论】:
以上是关于获取列总和并用于计算总数的百分比(mySQL)的主要内容,如果未能解决你的问题,请参考以下文章