按客户分组并按月列枢轴查询显示的Mysql销售表

时间:2015-02-26 03:35:58

标签: mysql database pivot-table

我有一个销售表,其中包含以下列:

|  Customer_Id | amount |  date  |

customer_id分组数据的最佳方法是什么,并在不同的月份列上显示每个Customer_id(每个Customer_id一行)的每月总金额(SUM)?

所需的输出类似于:

Customer     |January    | February   | March       | ....

Customer_id  |SUM amount | SUM amount | SUM amount | ....

我相信Sql这称为数据透视表。

¡谢谢!

6 个答案:

答案 0 :(得分:5)

我们假设您有以下表格:

mysql> select * from sales;
+-------------+--------+------------+
| customer_id | amount | date       |
+-------------+--------+------------+
|           1 |     12 | 2015-01-01 |
|           1 |      1 | 2015-01-02 |
|           1 |    663 | 2015-02-12 |
|           2 |     22 | 2015-01-03 |
|           2 |     21 | 2015-02-12 |
|           2 |     11 | 2015-02-12 |
|           2 |      9 | 2015-04-12 |
+-------------+--------+------------+

您可以使用此查询执行此操作:

SELECT
  customer_id,
  sum(if(month(date) = 1, amount, 0))  AS Jan,
  sum(if(month(date) = 2, amount, 0))  AS Feb,
  sum(if(month(date) = 3, amount, 0))  AS Mar,
  sum(if(month(date) = 4, amount, 0))  AS Apr,
  sum(if(month(date) = 5, amount, 0))  AS May,
  sum(if(month(date) = 6, amount, 0))  AS Jun,
  sum(if(month(date) = 7, amount, 0))  AS Jul,
  sum(if(month(date) = 8, amount, 0))  AS Aug,
  sum(if(month(date) = 9, amount, 0))  AS Sep,
  sum(if(month(date) = 10, amount, 0)) AS Oct,
  sum(if(month(date) = 11, amount, 0)) AS Nov,
  sum(if(month(date) = 12, amount, 0)) AS `Dec`
FROM sales
GROUP BY customer_id;

输出:

+-------------+------+------+------+------+------+------+------+------+------+------+------+------+
| customer_id | Jan  | Feb  | Mar  | Apr  | May  | Jun  | Jul  | Aug  | Sep  | Oct  | Nov  | Dec  |
+-------------+------+------+------+------+------+------+------+------+------+------+------+------+
|           1 |   13 |  663 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
|           2 |   22 |   32 |    0 |    9 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |    0 |
+-------------+------+------+------+------+------+------+------+------+------+------+------+------+

答案 1 :(得分:1)

MySQL为GROUP BY子句提供WITH ROLLUP修饰符。 Take a look at this.

... GROUP BY customer_id WITH ROLLUP

希望它有所帮助。

答案 2 :(得分:0)

试试这个:

SELECT `Customer_id` AS Customer,
SUM(`amount`) AS MONTHNAME(`date`)
FROM `sales`
GROUP BY YEAR(`date`), MONTH(`date`);

答案 3 :(得分:0)

试试这段代码。

SELECT Customer_id,SUM(金额),MONTHNAME(日期) 来自sales_table 按月分组(日期);

答案 4 :(得分:0)

此查询获得所需的结果:

SELECT Customer_id,

Sum(CASE WHEN MONTH(date) = 1 THEN amount END) AS Jan,
Sum(CASE WHEN MONTH(date) = 2 THEN amount END) AS Feb,
Sum(CASE WHEN MONTH(date) = 3 THEN amount END) AS Mar,
...

FROM table_name

GROUP BY Customer_id

感谢@ shawnt00的提示;)

答案 5 :(得分:0)

如果您在Piotr的答案中像这样更改每一行

sum(if(month(date) = 1, amount, 0))  AS Jan,

sum(if((month(date) = 1 AND year(date) = 2017 ),  amount,0))  AS Jan_17,

当数据超过一年时,您可以拆分表