首先,这是一个我试图操纵的表格的例子:
##################################
# TABLE_A #
##################################
+----------+----------+----------+
| ID | COLUMN_A | COLUMN_B |
+----------+----------+----------+
| 1 | 24 | 1 |
| 2 | 53 | 1 |
| 3 | 12 | 1 |
| 4 | 87 | 2 |
| 5 | 63 | 2 |
| 6 | 55 | 3 |
| 7 | 39 | 3 |
| 8 | 47 | 3 |
| 9 | 85 | 3 |
+----------+----------+----------+
当column_b具有相同的值时,我想计算column_a的每个值的百分比。
例如,当 column_b = 1 时,24 + 53 + 12 = 89,因此我们将获得以下百分比:
当我使用" WHERE"通过此请求可以看到column_b的值:
SELECT ROUND(
(column_a*100) / (SELECT SUM(column_a)
FROM TABLE_A
WHERE column_b=1)
) AS RESULT
FROM TABLE_A
where column_b=1;
+--------+
| RESULT |
+--------+
| 27 |
| 60 |
| 13 |
+--------+
但是,当我尝试计算column_b的每个值的所有百分比时,它仍然不起作用。
我试图通过' GROUP BY'但错误"子查询返回超过1行"发生了:
SELECT ROUND(
(column_a*100) / (SELECT SUM(column_a)
FROM TABLE_A
GROUP BY column_b)
) AS RESULT
FROM TABLE_A;
我理解为什么会出现这个错误,因为第二个SELECT返回3个值,并且不能连续划分这些值。那么,我怎么能做我想做的事呢?
答案 0 :(得分:2)
您可以在子查询中聚合并将其与主表连接,如下所示:
select t1.id, t1.column_b, t1.column_a, 100 * t1.column_a / t2.column_a perc
from table_a t1
inner join (
select column_b, sum(column_a) column_a
from table_a
group by column_b
) t2 on t1.column_b = t2.column_b;
答案 1 :(得分:0)
这应该做你想要的。如果您加入按列b分组的子查询,则应该能够获得主表中每条记录的总数。
SELECT ROUND(TABLE_A.COLUMN_A / t.total * 100) AS RESULT
FROM TABLE_A
INNER JOIN
(
SELECT ID, SUM(COLUMN_A) AS total, COLUMN_B
FROM TABLE_A
GROUP BY COLUMN_B
) AS t ON t.ID = TABLE_A.ID
WHERE t.COLUMN_B = TABLE_A.COLUMN_B