MySQL 枢轴相同 table
MySQL pivot in same table
MySQL pivot in same table with dynamic content
创建Table代码
CREATE TABLE `product_table` (
`id` INT(10) NOT NULL,
`pdate` DATE NULL DEFAULT NULL,
`product` VARCHAR(50) NULL DEFAULT NULL,
`counts` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
我有 table 结构如下
+----+------------+---------+--------+
| id | pdate | product | counts |
+----+------------+---------+--------+
| 1 | 2015-10-12 | BOX | 74 |
| 2 | 2015-10-12 | SHOE | 35 |
| 3 | 2015-10-12 | PEN | 38 |
| 4 | 2015-10-12 | WATCH | 36 |
| 5 | 2015-10-13 | BOX | 36 |
| 6 | 2015-10-13 | SHOE | 80 |
| 7 | 2015-10-13 | PEN | 70 |
| 8 | 2015-10-13 | WATCH | 73 |
+----+------------+---------+--------+
我想要这种格式的报告
+---------+------------+------------+
| product | 2015-10-12 | 2015-10-13 |
+---------+------------+------------+
| BOX | 74 | 36 |
| SHOE | 35 | 80 |
| PEN | 38 | 70 |
| WATCH | 36 | 73 |
+---------+------------+------------+
到目前为止我尝试了什么
select
d.p product,
(select date(p.pdate) from product_table p where date(p.pdate)=d.dt and p.product = d.p ) date,
(select p.counts from product_table p where date(p.pdate)=d.dt and p.product = d.p ) cnt
from
(select pt.product p,date(pt.pdate) dt from product_table pt group by pt.product,date(pt.pdate) ) as d
group by product
请试试这个:
去掉备注看查询
SELECT DISTINCT
CONCAT( 'SELECT p.product ',
GROUP_CONCAT(
CONCAT( ',SUM( IF(pdate = \'', pdate,'\', p.count,0)) as \'', pdate,'\'') SEPARATOR '\n'),
' FROM product_table p GROUP BY p.product;') INTO @sql FROM product_table p;
-- SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
遗憾的是 MySQL 没有实现 table 旋转。所以有构建动态查询的解决方法,这是我的例子:
SELECT
GROUP_CONCAT(DISTINCT(
CONCAT(
'MAX(
IF(pt.pdate = \'', pdate, '\', pt.counts, null)
) AS \'' , pdate, '\''
)
)
) INTO @dates FROM product_table;
SET @query = CONCAT('SELECT product, ', @dates, ' FROM product_table pt GROUP BY product');
PREPARE stmt FROM @query;
EXECUTE stmt;
请注意,如果您的 table 中有很多日期,速度可能会很慢
MySQL pivot in same table with dynamic content
创建Table代码
CREATE TABLE `product_table` (
`id` INT(10) NOT NULL,
`pdate` DATE NULL DEFAULT NULL,
`product` VARCHAR(50) NULL DEFAULT NULL,
`counts` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
我有 table 结构如下
+----+------------+---------+--------+
| id | pdate | product | counts |
+----+------------+---------+--------+
| 1 | 2015-10-12 | BOX | 74 |
| 2 | 2015-10-12 | SHOE | 35 |
| 3 | 2015-10-12 | PEN | 38 |
| 4 | 2015-10-12 | WATCH | 36 |
| 5 | 2015-10-13 | BOX | 36 |
| 6 | 2015-10-13 | SHOE | 80 |
| 7 | 2015-10-13 | PEN | 70 |
| 8 | 2015-10-13 | WATCH | 73 |
+----+------------+---------+--------+
我想要这种格式的报告
+---------+------------+------------+
| product | 2015-10-12 | 2015-10-13 |
+---------+------------+------------+
| BOX | 74 | 36 |
| SHOE | 35 | 80 |
| PEN | 38 | 70 |
| WATCH | 36 | 73 |
+---------+------------+------------+
到目前为止我尝试了什么
select
d.p product,
(select date(p.pdate) from product_table p where date(p.pdate)=d.dt and p.product = d.p ) date,
(select p.counts from product_table p where date(p.pdate)=d.dt and p.product = d.p ) cnt
from
(select pt.product p,date(pt.pdate) dt from product_table pt group by pt.product,date(pt.pdate) ) as d
group by product
请试试这个: 去掉备注看查询
SELECT DISTINCT
CONCAT( 'SELECT p.product ',
GROUP_CONCAT(
CONCAT( ',SUM( IF(pdate = \'', pdate,'\', p.count,0)) as \'', pdate,'\'') SEPARATOR '\n'),
' FROM product_table p GROUP BY p.product;') INTO @sql FROM product_table p;
-- SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
遗憾的是 MySQL 没有实现 table 旋转。所以有构建动态查询的解决方法,这是我的例子:
SELECT
GROUP_CONCAT(DISTINCT(
CONCAT(
'MAX(
IF(pt.pdate = \'', pdate, '\', pt.counts, null)
) AS \'' , pdate, '\''
)
)
) INTO @dates FROM product_table;
SET @query = CONCAT('SELECT product, ', @dates, ' FROM product_table pt GROUP BY product');
PREPARE stmt FROM @query;
EXECUTE stmt;
请注意,如果您的 table 中有很多日期,速度可能会很慢