В MySQL, если у вас есть неизвестное количество столбцов для поворота, вы можете использовать подготовленные операторы , и ваш код будет выглядеть так (см. SQL Fiddle with Demo ):
CREATE TABLE Table1
(`Date` datetime, `Product` varchar(7), `Sold` int)
;
INSERT INTO Table1
(`Date`, `Product`, `Sold`)
VALUES
('2001-01-01 00:00:00', 'P1', 100),
('2001-01-01 00:00:00', 'P2', 250),
('2001-01-01 00:00:00', 'P3', 50),
('2001-02-01 00:00:00', 'P1', 170),
('2001-02-01 00:00:00', 'P2', 0),
('2001-02-01 00:00:00', 'P3', 70)
;
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(case when Product = ''',
Product,
''' then sold else 0 end) AS ',
Product
)
) INTO @sql
FROM Table1;
SET @sql = CONCAT('SELECT Date, ', @sql, '
FROM table1
GROUP BY date');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;