2015-10-13 55 views
3

MySQL的枢轴在同一个表中具有动态内容MySQL的枢轴在同一个表

创建表的代码

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; 

我具有表结构如下

+----+------------+---------+--------+ 
| 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 
+0

是日期参数,或者你会让他们从表 –

+0

@BerndBuffen将从表 – vickisys

+0

得到所以它可以很多领域,为每个日期1? –

回答

1

不幸MySQL没有实现表转轴。因此,有解决办法以建设动态查询,这里是我的例子:

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; 

请注意,如果你有很多您的表的日期也可能会很慢

+0

它的工作完美无瑕,是否有可能优先使用jstl和jsp – vickisys

+0

不幸的是,我从来没有使用过jstl和jsp,所以我不能回答你的问题。顺便说一句你错误的答案是正确的:) –

0

请试试这个: 删除的话查看查询

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;