3

実行したい非常に複雑な mySQL クエリがあり、その記述方法を考えるのに苦労しています。

基本的に私は3つのテーブルを持っています:

a(aID, name);
b(bID, val);
ab(aID, bID, include)

私がやりたいのは、次のようなテーブルを作成するクエリを作成することです:

c(aID, percentage);

このようにパーセンテージを(合計/可能)にしたい。合計はこのように計算されます。a 行と b 行に関係があり、かつ include が 1 であるたびに、total に b.val の値を追加します。ab.include = 0 の場合を除いて、b.val の合計が可能です。

例えば:

a:
+-----+
| aID |
+-----|
| 1   |
| 2   |
| 3   |
+-----+

b:
+-----+-----+
| bID | val |
+-----+-----+
| 1   |   1 |
| 2   |   1 |
| 3   |   1 |
+-----+-----+

ab:
+-----+-----+---------+
| aID | bID | include |
+-----+-----+---------+
| 1   |   1 |       1 |
| 1   |   3 |       0 |
| 2   |   1 |       1 |
| 3   |   1 |       1 |
| 3   |   2 |       1 |
| 3   |   3 |       1 |
+-----+-----+---------+

c:
+-----+------------+
| aID | percentage |
+-----+------------+
| 1   |         50 |
| 2   |      33.33 |
| 3   |        100 |
+-----+------------+

現在、私はこれを持っています:

SELECT a.aID, (SUM(b.val)/(SELECT SUM(val) FROM b))*100 AS percentage
FROM a, ab, b
WHERE a.aID = ab.aID AND ab.bID = b.bID
GROUP BY a.aID

これは、重量に関して aID が bID とペアになっている割合を示しますが、この別の計算を追加したかったのです。

これは可能ですか?

これを試しましたが、うまくいきませんでした:

私はこれをしようとしていました:

SELECT a.aID, (SUM(b.val)/(SELECT SUM(val) FROM b,ab WHERE ab.include = 1))*100 AS percentage
FROM a, ab, b
WHERE a.aID = ab.aID AND ab.bID = b.bID AND ab.include = 1
GROUP BY a.aID
4

1 に答える 1

4

これを試してください(sqlfiddle):

SELECT ab.aID, SUM(b.val*ab.include)/(possible.possible-SUM((1-ab.include)*b.val))*100 AS percentage
FROM ab, b, (SELECT SUM(val) possible FROM b) possible
WHERE ab.bID = b.bID
GROUP BY ab.aID

分子 (合計): 関係があるすべての b 値の合計

分母 (可能): すべての b 値の合計から、関係があり、含む値が 0 の場合に値を差し引きます。

于 2013-05-01T07:29:23.833 に答える