Mysql 销售额 table 按客户分组并按月列显示数据透视查询
Mysql sales table grouped by customer and displayed by month columns pivot query
我有一个 sales table 包含以下列:
| Customer_Id | amount | date |
按 customer_id
对数据进行分组并显示每个 Customer_id 的每月总金额 (SUM)(每个 Customer_id 一行)的最佳方法是什么?月份列?
所需的输出类似于:
Customer |January | February | March | ....
Customer_id |SUM amount | SUM amount | SUM amount | ....
我相信Sql这叫做支点table。
¡谢谢!
试试这个:
SELECT `Customer_id` AS Customer,
SUM(`amount`) AS MONTHNAME(`date`)
FROM `sales`
GROUP BY YEAR(`date`), MONTH(`date`);
试试这个代码。
SELECT Customer_id
, SUM(数量), MONTHNAME(日期)
来自 sales_table
按月分组(日期);
假设您有以下 table:
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 |
+-------------+------+------+------+------+------+------+------+------+------+------+------+------+
这个查询得到了想要的结果:
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 提醒 ;)
MySQL 为 GROUP BY 子句提供 WITH ROLLUP 修饰符。 Take a look at this.
...
GROUP BY customer_id WITH ROLLUP
希望对您有所帮助。
如果您像这样更改 Piotr 的回答中的每一行
sum(if(month(date) = 1, amount, 0)) AS Jan,
至
sum(if((month(date) = 1 AND year(date) = 2017 ), amount,0)) AS Jan_17,
如果数据超过一年
,您可以拆分table
我有一个 sales table 包含以下列:
| Customer_Id | amount | date |
按 customer_id
对数据进行分组并显示每个 Customer_id 的每月总金额 (SUM)(每个 Customer_id 一行)的最佳方法是什么?月份列?
所需的输出类似于:
Customer |January | February | March | ....
Customer_id |SUM amount | SUM amount | SUM amount | ....
我相信Sql这叫做支点table。
¡谢谢!
试试这个:
SELECT `Customer_id` AS Customer,
SUM(`amount`) AS MONTHNAME(`date`)
FROM `sales`
GROUP BY YEAR(`date`), MONTH(`date`);
试试这个代码。
SELECT Customer_id
, SUM(数量), MONTHNAME(日期)
来自 sales_table
按月分组(日期);
假设您有以下 table:
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 |
+-------------+------+------+------+------+------+------+------+------+------+------+------+------+
这个查询得到了想要的结果:
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 提醒 ;)
MySQL 为 GROUP BY 子句提供 WITH ROLLUP 修饰符。 Take a look at this.
...
GROUP BY customer_id WITH ROLLUP
希望对您有所帮助。
如果您像这样更改 Piotr 的回答中的每一行
sum(if(month(date) = 1, amount, 0)) AS Jan,
至
sum(if((month(date) = 1 AND year(date) = 2017 ), amount,0)) AS Jan_17,
如果数据超过一年
,您可以拆分table