Помощь, необходимая для поворота (SQL Server 2005) - PullRequest
0 голосов
/ 25 мая 2010

У меня есть таблица, как

ID  Grps    Vals
--- ----    -----
1   1   1
1   1   3
1   1   45
1   2   23
1   2   34
1   2   66
1   3   10
1   3   17
1   3   77
2   1   144
2   1   344
2   1   555
2   2   11
2   2   22
2   2   33
2   3   55
2   3   67
2   3   77

Желаемый результат:

ID  Record1     Record2     Record3
--- -------     -------     -------
1   1       23      10      
1   3       34      17      
1   45      66      77
2   144     11      55
2   344     22      67
2   555     33      77

Я пытался (используя цикл while), но программа работает медленно. Меня попросили сделать это, используя подход на основе SET. Мой подход пока что

SELECT  ID,[1] AS [Record1], [2] AS [Record2], [3] as [Record3]
    FROM (  
    Select 
        Row_Number() Over(Partition By ID Order By Vals) records
        ,* 
        From myTable)x
    PIVOT
  (MAX(vals) FOR Grps IN ([1],[2],[3])) p

Но это не работает.

Может ли кто-нибудь помочь решить эту проблему. (SQL SERVER 2005)

Ответы [ 3 ]

2 голосов
/ 29 мая 2010

Вы были почти там! Все, что мне нужно было сделать, это добавить необходимые столбцы в предложения Partition By и Order By.

SELECT  ID,[1] AS [Record1], [2] AS [Record2], [3] as [Record3] 
    FROM (   
    Select  
        Row_Number() Over(Partition By id, grps Order By id, grps, vals) records 
        ,*  
        From myTable)x 
    PIVOT 
  (MAX(vals) FOR Grps IN ([1],[2],[3])) p 
0 голосов
/ 03 июня 2010

Это может не относиться к вам, но если вы используете цикл while, как ....

while( x<Total.length() ){
....do something
}

you should declare Total.length outside of the loop assigned to a variable...

int spoon= Total.length();
while( x< spoon ){
....do something
}

или еще

вы вычисляете число Total.length () каждый раз при запуске цикла

0 голосов
/ 02 июня 2010

Более простой подход, который не предполагает использования PIVOT, будет выглядеть примерно так:

;With ItemGroups As
    (
    Select Id, Grps, Vals 
        , Row_Number() Over ( Partition By Id, Grps Order By Vals ) As RowNum
    From myTable
    )
Select Id
    , Max( Case When Grps = 1 Then Vals End )
    , Max( Case When Grps = 2 Then Vals End )
    , Max( Case When Grps = 3 Then Vals End )
From ItemGroups
Group By Id, RowNum
Order By Id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...