2012-03-19 7 views
0

Как я могу преобразовать следующее:SQL использовать строки в столбцы

+------+---------+------+ 
| Date | Product | Sold | 
+------+---------+------+ 
| 1/1 | P1  | 100 | 
| 1/1 | P2  | 250 | 
| 1/1 | P3  | 50 | 
| 2/1 | P1  | 170 | 
| 2/1 | P2  | 0 | 
| 2/1 | P3  | 70 | 
+------+---------+------+ 

В таблицу, как это:

+------+-----+-----+----+ 
| Date | P1 | P2 | P3 | 
+------+-----+-----+----+ 
| 1/1 | 100 | 250 | 50 | 
| 2/1 | 170 | 0 | 70 | 
+------+-----+-----+----+ 

Использование SQL?
Я знаю количество продуктов (ровно 3).

+0

Пожалуйста, найдите шарниры. Какую базу данных вы используете? –

+2

PIVOT. какую базу данных вы используете? – Randy

+0

@AmitBhargava Я использую MySQL – baruch

ответ

5

Многого DBMSes предлагает определенную поддержку «шарниры» или «отчеты кросса», но если ваша СУБД не произойдет, или если вы предпочитаете решение, которое будет работать на различном DBMSes, вы можете написать:

SELECT Date, 
     MIN(CASE WHEN Product = 'P1' THEN Sold END) AS "P1", 
     MIN(CASE WHEN Product = 'P2' THEN Sold END) AS "P2", 
     MIN(CASE WHEN Product = 'P3' THEN Sold END) AS "P3" 
    FROM ___insert_table_name_here___ 
GROUP 
    BY Date 
; 

Отредактировано для добавления: Вы уже упоминали, что используете MySQL, у которого нет, есть специальная поддержка pivot или кросс-таблицы, поэтому вышеприведенный запрос - это путь.

0

Если SQL Server 2005+:

SELECT 
    Date 
    , [P1] 
    , [P2] 
    , [P3] 
FROM 
(
    SELECT 
     Date 
     , Product 
     , Sold 
    FROM 
     ProductSold 
) AS t1 
PIVOT 
(
    MIN(Sold) 
    FOR Product IN ([P1], [P2], [P3]) 
) AS pvt 
ORDER BY 
    Date ASC; 
0

В MySQL, если у вас есть неизвестное число столбцов, чтобы повернуть, то вы можете использовать prepared statements и ваш код будет выглядеть следующим образом (см 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;