0

2 つのテーブルからのシェア パーセンテージ計算の集計結果を返したいのですが、これを行う方法がわかりません。私のテーブルは次のとおりです。

テーブル

---+-----------+---------+-----------+---------+-----------+---------+----------+
id | product_1 | share_1 | product_2 | share_2 | product_3 | share_3 |  amount  |
---+-----------+---------+-----------+---------+-----------+---------+----------+
 1 |    3      |   50    |     2     |    50   |           |         |  5000    |
 2 |    2      |   50    |     1     |    25   |     4     |   25    |  10000   |
 3 |    5      |   50    |     4     |    50   |           |         |  7000    |
---+-----------+---------+-----------+---------+-----------+---------+----------+

テーブル製品

---+-----------+
id | name      |
---+-----------+
 1 | Book      |
 2 | Pen       |
 3 | Ruler     |
 4 | Pencil    |
 5 | Calendar  |
---+-----------+

私は結果が次のように出てくることを望みます:

Product_name | Total
-------------+----------
Book         | 2500
Pen          | 7500
Ruler        | 2500
Pencil       | 6000
Calendar     | 3500
-------------+----------
Grand Total  | 22000

これまでのところ、私はこのクエリを試しました

$this->db->select('t1.name as product_name, sum(t2.amount) as total');
$this->db->from('products t1');
$this->db->join('pa t2', 't2.product_1 = t1.id OR t2.product_2 = t1.id OR t2.product_3 = t1.id', 'left');
$this->db->group_by('t1.name');
$query = $this->db->get();

SQL フィドル: http://sqlfiddle.com/#!2/471c4/1

しかし、各製品のシェア率の計算がないため、必要な結果が返されません。

SQLクエリのみで必要な結果を返す方法はありますか? または、PHP で再帰的に計算を行う必要がありますか?

4

2 に答える 2

0

最初にデータのピボットを解除して計算を行うことができます。

select p.name, sum(amount)
from ((select product_1 as pid, amount*share_1 / 100.0 as amount from pa) union all
      (select product_2 as pid, amount*share_2 / 100.0 as amount from pa) union all
      (select product_3 as pid, amount*share_3 / 100.0 as amount from pa)
     ) pp join
     product p
     on pp.pid = p.id
group by p.name

アプリケーションまたは を使用して、合計を取得できますROLLUP

于 2013-02-21T04:09:53.050 に答える
0

以下のSQLを試してください:

SELECT product_name, SUM(percentage)
FROM
(
    SELECT  t1.name as product_name, t2.share_1, t2.amount, (t2.share_1*t2.amount)/100 as percentage        
    FROM products t1 JOIN pa t2 ON  t2.product_1 = t1.id
    GROUP BY t1.name
    UNION
    SELECT  t1.name as product_name, t2.share_2, t2.amount, (t2.share_2*t2.amount)/100         as percentage        
    FROM products t1 JOIN pa t2 ON  t2.product_2 = t1.id
    GROUP BY t1.name
    UNION
    SELECT  t1.name as product_name, t2.share_3, t2.amount, (t2.share_3*t2.amount)/100 as percentage        
    FROM products t1 JOIN pa t2 ON  t2.product_3 = t1.id
    GROUP BY t1.name
) as temp_table
GROUP BY product_name

SqlFiddle デモ

于 2013-02-21T04:23:35.507 に答える