2017-01-02 20 views
3

はまず、ここで私が操作しようとしているテーブルの一例であるが返されます。MySQLの - サブクエリが複数の1行

################################## 
#    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 + = 89 12私たちは以下のパーセンテージを取得する:

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

私はあなたがこの要求に見ることができるようにCOLUMN_Bの値を示すために、「WHERE」を使用する場合これが働いている:

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の値ごとにすべてのパーセンテージを計算しようとすると、それでも機能しません。

私が「BY GROUP」が、エラーでこれを行うことを試みた起こっ「サブクエリは複数の行を返す」:私はこのエラーを持っている理由私は理解

SELECT ROUND(
     (column_a*100)/(SELECT SUM(column_a) 
          FROM TABLE_A 
          GROUP BY column_b) 
     ) AS RESULT 
FROM TABLE_A; 

第SELECT戻り3つの値のためこれらを連続して分割することはできません。では、私はどうしたらいいですか?

答えて

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; 
+0

うわー、本当にありがとうございました! – Paktros

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 
関連する問題