2015-10-13 2 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

работает безупречно, можно ли excecute использовать 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; 
Смежные вопросы