MySQL - 子查询返回超过1行

时间:2017-01-02 16:29:12

标签: mysql

首先,这是一个我试图操纵的表格的例子:

##################################
#             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,因此我们将获得以下百分比:

  • 24:27%
  • 53:60%
  • 12:13%

当我使用" 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个值,并且不能连续划分这些值。那么,我怎么能做我想做的事呢?

2 个答案:

答案 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
相关问题