mysql - 1 年月度摘要及份额百分比

标签 mysql

我正在尝试为我的应用做一个预先报告。现在我遇到了一些查询的问题。

详情如下:

表格产品

 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 语法错误。

最佳答案

使用相同的查询,并创建带有子查询的 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

关于mysql - 1 年月度摘要及份额百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15427701/

相关文章:

mysql - 在sql中打印奇数id的 'O'和偶数id的 'E'

mysql - 在 sql 中查询——数据透视或任何其他方式

javascript - 解决node-mysql初始化错误?

mysql - 在循环中运行 SQL count(*) 查询或尝试将其合并到父查询中是否更快?

mysql - MySQL 事件有多昂贵?

Mysql基于int的列字符串

php - 如何从 mysql 中提取登录用户 ID

mysql - 返回函数中的计数 - Mysql

php - Laravel 中的表连接

Mysql更新记录出错