2013-09-06 23 views
7

Próbuję przestawić na wiele kolumn. Używam serwera SQL 2008. Oto, co starałem tak dalekoPivot serwera SQL na wielu kolumnach

CREATE TABLE #t (id int, Rscd varchar(10),Accd varchar(10),position int) 

INSERT INTO #t Values (10,'A','B',1) 

INSERT INTO #t Values (10,'C','D',2) 

Select id,[1],[2],[11],[12] FROM 
(SELECT id, Rscd,Accd, position , position +10 as Aposition 
From #t) 
As query 
PIVOT (MAX(Rscd) 
     FOR Position IN ([1],[2])) AS Pivot1 
     PIVOT (MAX(Accd) 
     FOR Aposition IN ([11],[12])) AS Pivot2 

Poniżej wskazane jest wynikiem, że jestem coraz

id 1  2  11 12 
10 NULL C  NULL D 
10 A  NULL B  NULL 

Ale wynik, że staram się osiągnąć to,

id 1 2 11 12 
10 A C B D 

Każda pomoc? co jest nie tak w moim kodzie.

+0

możliwy duplikat [Multiple Pivot kolumna w T-SQL] (http://stackoverflow.com/questions/947281/multiple-column-pivot-in-t-sql) –

Odpowiedz

11

Najpierw rozpakowałbym kolumny w pary, a następnie je przestawiłem. Zasadniczo proces rozpakowywania przekształci pary kolumn (rscd, position i accd, aposition) w wiersze, a następnie można zastosować przestawny. Kod będzie:

select id, [1], [2], [11], [12] 
from 
(
    select id, col, value 
    from #t 
    cross apply 
    (
    select rscd, position union all 
    select Accd, position + 10 
) c (value, col) 
) d 
pivot 
(
    max(value) 
    for col in ([1], [2], [11], [12]) 
) piv; 

Zobacz SQL Fiddle with Demo

+1

Bluefeet - Czy możemy agregować przez wiele kolumn w pivocie? Na przykład. max (wartość), min (col1), suma (col5). Jeśli tak, czy istnieje na to dobry przykład? –

+2

@ Trojan.ZBOT Możliwe są inne sposoby uzyskiwania końcowego efektu poza używaniem przestawnego. Jeśli masz konkretne pytanie, to opublikuję jedną, aby uzyskać najlepszą odpowiedź ... łatwiej będzie niż wracać do komentarzy. :) – Taryn

+1

Jestem trochę zaniepokojony spadkowcami. Ale, czy możemy mieć pivot ( max (wartość), min (col1), suma (col5) dla col w ([1], [2], [11], [12]) ) piv; –

-3

Dont użyć kolumny ID. Użyj tabeli wyprowadzonej, aby pobrać wszystkie kolumny z wyjątkiem identyfikatora, a następnie użyj tabeli PIVOT.

4
Select id,sum([1]),sum([2]),sum([11]),sum([12]) FROM 
(SELECT id, Rscd,Accd, position , position +10 as Aposition 
From #t) 
As query 
PIVOT (MAX(Rscd) 
     FOR Position IN ([1],[2])) AS Pivot1 
     PIVOT (MAX(Accd) 
     FOR Aposition IN ([11],[12])) AS Pivot2 

group by id 
+4

Czy mógłbyś nieco wyjaśnić, w jaki sposób Twoje rozwiązanie pozwala osiągnąć to, co zadał OP? Tylko kopiowanie/wklejanie kodu bez zrozumienia, co robi, nie jest zabawne. –