1

我正在尝试为我的应用程序制作一份预先报告。现在我遇到了一些查询的麻烦。

这是详细信息:

表产品

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

表事件

 id  | name
-----+---------
 1   | Launching
 2   | Sale
 3   | Roadshow
 4   | Presentation
 5   | Normal

表交易

---+------------+-------+-----------+---------+-----------+---------+-----------+---------+----------+
id | date       | event | product_1 | share_1 | product_2 | share_2 | product_3 | share_3 |  amount  |
---+------------+-------+-----------+---------+-----------+---------+-----------+---------+----------+
 1 | 2013-01-12 |   1   |    3      |   50    |     2     |    50   |           |         |  5000    |
 2 | 2013-02-13 |   3   |    2      |   50    |     1     |    25   |     4     |   25    |  10000   |
 3 | 2013-01-13 |   5   |    5      |   50    |     4     |    50   |           |         |  7000    |
 4 | 2013-04-13 |   2   |    1      |   100   |           |         |           |         |  5000    |
---+------------+-------+-----------+---------+-----------+---------+-----------+---------+----------+

我想显示的是这样的

--------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
Product Name  |  Jan  |  Feb  |  Mar  |  Apr  |  May  |  Jun  |  Jul  |  Aug  |  Sep  |  Oct  |  Nov  |  Dec  |
--------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
 Book         |       | 2500  |       | 5000  |       |       |       |       |       |       |       |       |
 Pen          | 2500  | 5000  |       |       |       |       |       |       |       |       |       |       |
 Ruler        | 2500  |       |       |       |       |       |       |       |       |       |       |       |
 Calendar     | 3500  | 2500  |       |       |       |       |       |       |       |       |       |       |
 Scissors     | 3500  |       |       |       |       |       |       |       |       |       |       |       |
--------------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+

我尝试过的:我使用以下查询成功生成了事件名称分组的输出

SELECT t1.name as sort_name, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 1, t2.amount, 0)) as total_jan, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 2, t2.amount, 0)) as total_feb, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 3, t2.amount, 0)) as total_mar, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 4, t2.amount, 0)) as total_apr, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 5, t2.amount, 0)) as total_may, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 6, t2.amount, 0)) as total_jun, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 7, t2.amount, 0)) as total_jul, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 8, t2.amount, 0)) as total_aug, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 9, t2.amount, 0)) as total_sep, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 10, t2.amount, 0)) as total_oct, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 11, t2.amount, 0)) as total_nov, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 12, t2.amount, 0)) as total_dec, 
    sum(IF(YEAR(t2.date) = 2013, t2.amount, 0)) as event_total 
FROM events t1 
LEFT JOIN transactions t2 ON t2.event_id = t1.id 
GROUP BY sort_name

但我不知道按产品分组。我试过玩 union 但仍然返回 SQL 语法错误。

4

2 回答 2

0

使用相同的查询,并使用子查询创建规范化版本table_product

SELECT t1.name as sort_name, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 1, t2.amount, 0)) as total_jan, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 2, t2.amount, 0)) as total_feb, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 3, t2.amount, 0)) as total_mar, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 4, t2.amount, 0)) as total_apr, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 5, t2.amount, 0)) as total_may, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 6, t2.amount, 0)) as total_jun, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 7, t2.amount, 0)) as total_jul, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 8, t2.amount, 0)) as total_aug, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 9, t2.amount, 0)) as total_sep, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 10, t2.amount, 0)) as total_oct, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 11, t2.amount, 0)) as total_nov, 
    sum(IF(YEAR(t2.date) = 2013 AND MONTH(t2.date) = 12, t2.amount, 0)) as total_dec
FROM table_product t1
LEFT OUTER JOIN
(
    SELECT product_1 AS product_id, 
        amount * share_1 / (share_1 + COALESCE(share_2,0) + COALESCE(share_3,0))
            AS amount
    FROM table_transaction
    WHERE product_1 IS NOT NULL
    UNION ALL
    SELECT product_2 AS product_id, 
        amount * share_2 / (share_2 + COALESCE(share_1,0) + COALESCE(share_3,0))
            AS amount
    FROM table_transaction
    WHERE product_2 IS NOT NULL
    UNION ALL
    SELECT product_3 AS product_id, 
        amount * share_3 / (share_3 + COALESCE(share_2,0) + COALESCE(share_1,0))
            AS amount
    FROM table_transaction
    WHERE product_3 IS NOT NULL
) t2 ON t2.product_id = t1.id 
GROUP BY sort_name
于 2013-03-15T08:30:44.010 回答
0

你必须加入产品表而不是事件

于 2013-03-15T08:39:25.567 回答