Вот возможное решение. Возможно, вам придется изменить его в соответствии с вашими потребностями:
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`ordertotals` $$
CREATE PROCEDURE `test`.`ordertotals` ()
BEGIN
DECLARE `xtab_qry` VARCHAR(4096) DEFAULT '';
SELECT CONCAT('SELECT o.product_id ',
GROUP_CONCAT(
DISTINCT
CONCAT(', SUM(IF(o.created_at="', ol.created_at,
'",o.quantity,null)) AS "',
DATE_FORMAT(ol.created_at, "%m/%d/%Y"),
'"')
ORDER BY ol.created_at
SEPARATOR ''
),
' FROM orderlines o WHERE 1 GROUP BY o.product_id'
) AS stuff
INTO
@xtab_qry
FROM
orderlines ol
WHERE 1;
PREPARE my_sql_statement
FROM @xtab_qry;
EXECUTE my_sql_statement;
DEALLOCATE
PREPARE my_sql_statement;
END $$
DELIMITER ;
С данными этого теста:
product_id quantity created_at
1 4 2009-09-14
1 5 2009-09-14
2 2 2009-09-14
3 3 2009-09-13
1 9 2009-09-15
1 2 2009-09-16
Он дал такие результаты:
product_id 09/13/2009 09/14/2009 09/15/2009 09/16/2009
1 9 9 2
2 2
3 3
Надеюсь, это поможет!
EDIT:
Таким образом, это создает хранимую процедуру, которая генерирует динамическую строку SQL. Затем он выполняет этот запрос. Вот почему это должно быть в хранимой процедуре. indiecompanyllc указал на замечательную статью, которую я использовал некоторое время назад, чтобы узнать, как это сделать. Вот эта ссылка: http://rpbouman.blogspot.com/2005/10/creating-crosstabs-in-mysql.html.