2012-02-02 2 views
3

У меня есть таблица данных, как в следующемSQL сводной таблицы или преобразования

User Year Points Value 
A 1997 1  10 
A 1997 2  30 
A 1997 3  40 
A 1999 1  70 
B 1993 1  7 
B 1993 3  4 
C 2001 1  10 
..... 

Я хочу, чтобы таблица трансформироваться как таковые:

User Year Points1 Points2 Points3 .... 
A  1997 10  30  40 
A  1999 70  null  null 
B  1993 7  null  4 
C  2001 10  null  null 
...... 

Диапазон точек неизвестен во время компиляции время, поэтому это не только от 1 до 3. Это почти похоже на то, чтобы Точки были как заголовок столбца в новой таблице. Я полагаю, что SQL PIVOT - хороший вариант, но мне не повезло с этим. Я использую SQL 2008.

+0

Какие базы данных вы используете? – Bohemian

ответ

2

Поскольку вы упомянули SQL PIVOT я предполагаю, что вы используете SQL Server 2005 или более поздней версии или Oracle 11g

SQL 2005

SELECT [user], year, [1] as Point1, [2] as Point2, [3] as Point3 
FROM 
(

SELECT [user], year , points, Value 
    FROM table) AS SourceTable 
PIVOT 
(
SUM(Value) 
FOR Points IN ([1], [2], [3]) 
) AS PivotTable 
ORDER BY [user] 

см работает пример в это data.se query

Oracle 11g

Если вы используете Oracle 11g было бы Somthing как это (не уверен, что псевдоним поля)

SELECT * 
FROM (
     SELECT user, year , points, Value 
     FROM table) 
PIVOT (SUM(Value) AS sum_value FOR (Points) IN ('1' as Point1 , 
                '2' as Point2, 
               '3' as Point3)) 
Order by User; 
+0

К сожалению, я забыл упомянуть, что диапазон точек неизвестен во время компиляции, поэтому это не только от 1 до 3 – wd113

+0

Ну, вам нужно сделать выше, но с динамическим SQL см. [T-SQL Pivot? Возможность создания столбцов таблицы из значений строк] (http://stackoverflow.com/a/2922815/119477) –

+0

Спасибо за ваш повтор, я попробовал ваш SQL и правильно получил столбцы User и Year, но в других столбцах отображается NULL. – wd113

0

Может быть, это поможет:

Сначала создайте некоторые тестовые данные:

CREATE TABLE tblPoints ([User] VARCHAR(100), [Year] INT,Points INT,Value INT) 
INSERT INTO tblPoints 
SELECT 'A',1997,1,10 UNION ALL 
SELECT 'A',1997,2,30 UNION ALL 
SELECT 'A',1997,3,40 UNION ALL 
SELECT 'A',1999,1,70 UNION ALL 
SELECT 'B',1993,1,7 UNION ALL 
SELECT 'B',1993,3,4 UNION ALL 
SELECT 'C',2001,1,10 

в concating столбцов:

DECLARE @cols VARCHAR(MAX) 
SELECT @cols = COALESCE(@cols + ','+QUOTENAME('Points'+Points), 
        QUOTENAME('Points'+Points)) 
FROM 
    (
     SELECT 
      ROW_NUMBER() OVER(PARTITION BY tblPoints.Points ORDER BY tblPoints.Points) AS RowNbr, 
      CAST(tblPoints.Points AS VARCHAR(5)) AS Points 
     FROM 
      tblPoints 
    ) AS tbl 
WHERE 
    tbl.RowNbr=1 

Затем создать динамический SQL и исполняющий его:

DECLARE @query NVARCHAR(4000)= 
N'SELECT 
    * 
FROM 
(
    SELECT 
     tblPoints.[User], 
     tblPoints.[Year], 
     ''Points''+CAST(tblPoints.Points AS VARCHAR(5)) AS Points, 
     tblPoints.Value 
    FROM 
     tblPoints 
) AS p 
PIVOT 
(
    SUM(Value) FOR Points IN('[email protected]+') 
) AS pvt 
ORDER BY [User]' 

EXECUTE(@query) 

И потому, что я не хочу точку таблицы:

DROP TABLE tblPoints 
Смежные вопросы