获取列总和并用于计算总数的百分比(mySQL)

获取列总和并用于计算总数的百分比(mySQL),mysql,Mysql,这是我桌子的基本情况。我有第1列和第2列,需要生成第3列。第3列是所有Name的Number列的总和除以给定行的Number | Name | Number | % of total | | ------------- |:-------------:| -----: | | Bob | 5 | 25 | | Sally | 10 | 50

这是我桌子的基本情况。我有第1列和第2列,需要生成第3列。第3列是所有
Name
Number
列的总和除以给定行的
Number

| Name          | Number        | % of total  |
| ------------- |:-------------:| -----:      |
| Bob           | 5             |  25         |
| Sally         | 10            |  50         |
| John          | 5             |  25         |
我正在努力解决如何得到数字行的总数,并将其用作计算其余数字的值


编辑:如果可能的话,我希望将其作为一个单独的查询,而不是两个单独的查询。

您只需将
交叉连接
编号
列的
SUM()

SELECT Name, Number, Number * 100 / t.s AS `% of total`
FROM mytable
CROSS JOIN (SELECT SUM(Number) AS s FROM mytable) t

您可以通过子选择来获得它:

SELECT Name, Number, Number * 100 / (select sum(Number) FROM MYTABLE) AS '% of total'
FROM mytable

如果我这样做,我会先存储一个包含总数的变量,如下所示:

SET @total := (SELECT SUM(number) FROM myTable);
SELECT name, number, (number / @total) * 100 AS percentage
FROM myTable;
一旦有了这个变量,我就可以运行一个查询,得到每行的百分比,如下所示:

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;

以下是每种方法的一个示例。

您事先有第二列的总和吗?@SalmonKiller没有。这是(对我来说)棘手的部分。尝试获取该值,然后在一个查询中使用它。这对我有用…谢谢!一个问题。如果我想添加一个
WHERE
子句(例如
WHERE name=“Bob”
),那会去哪里?我试图将其放在mytable
中的
之后,但出现了错误。@jonmrich这取决于您要筛选的内容。是否应用了
SUM
的行?然后您必须在
交叉连接的
选择中执行此操作。否则,
其中
必须放在
交叉连接
之后。正如您所想象的,实际上我的表要比这个复杂得多。我有多个同名的列(代表同一个人),我需要将这些实例加在一起(例如,Bob的总数),并将其除以
数字
列的总数。我想这就是我挂断电话的地方。@jonmrich我想可能就是你要找的。谢谢……我把它都用在了一些
group by
where
的正确位置上。我从来没有用过存储变量。储存多长时间?我可以在上面写吗?我需要在单独的查询中运行这些吗?很多问题…@jonmrich如果我没有弄错的话,它们是分开运行的,我现在在你的编辑中看到,你可能不希望这样。我相信它在存储过程中更有用。至于它能保存多久,我不确定。这可能只是你当前的部分,明白了……以后要知道这一点是件好事,尽管它不适用于这里。要明确的是,mysql中的@变量将持续你的连接期限,并且是该连接的本地变量。因此,如果您连接,设置变量,然后继续使用该变量运行查询,您将不会有问题。此外,如果您有多个连接,所有设置和使用相同的变量名,它们都有自己的“副本”,并且不会在另一个连接上更新/更改相同的变量。谢谢您的澄清,Dev!