2013-03-11 10 views
7
JOB  ENAME 
-------- ---------- 
ANALYST SCOTT 
ANALYST FORD 
CLERK  SMITH 
CLERK  ADAMS 
CLERK  MILLER 
CLERK  JAMES 
MANAGER JONES 
MANAGER CLARK 
MANAGER BLAKE 
PRESIDENT KING 
SALESMAN ALLEN 
SALESMAN MARTIN 
SALESMAN TURNER 
SALESMAN WARD 

Chciałbym sformatować wynik ustawione tak, że każde zadanie dostaje swoją własną kolumnę:Strumienie tabeli przestawnej grupowanie pod kolumną obrotu?

CLERKS ANALYSTS MGRS PREZ SALES 
------ -------- ----- ---- ------ 
MILLER FORD  CLARK KING TURNER 
JAMES SCOTT  BLAKE  MARTIN 
ADAMS    JONES  WARD 
SMITH 

próbowałem

SELECT ANALYST, CLERK, MANAGER, PRESIDENT, SALESMAN from 
(
    SELECT ename, job from emp 
) as st 
pivot 
(
    SELECT ename 
    FOR job in (ANALYST, CLERK, MANAGER, PRESIDENT, SALESMAN) 
) as pivottable 

ja się tych błędów

Msg 156, Poziom 15, Stan 1, Linia 7
Niepoprawna syn podatek w pobliżu słowa kluczowego "WYBIERZ".
Msg 156, poziom 15, stan 1, wiersz 8
Niepoprawna składnia w pobliżu słowa kluczowego "w".

Jak używać przestawnego do grupowania ciągów w kolumnie przestawnej?

+0

@ Czyszczenie Dvvoter do komentowania? Nic nie jest złe w moim pytaniu. –

+0

Oczywiście było to interesujące pytanie. +1 ode mnie ... –

Odpowiedz

17

Podczas korzystania z funkcji PIVOT wymagane jest użycie funkcji agregującej. Składnia PIVOT jest:

Od MSDN:

SELECT <non-pivoted column>, 
    [first pivoted column] AS <column name>, 
    [second pivoted column] AS <column name>, 
    [last pivoted column] AS <column name> 
FROM 
    (<SELECT query that produces the data>) 
    AS <alias for the source query> 
PIVOT 
(
    <aggregation function>(<column being aggregated>) 
FOR 
[<column that contains the values that will become column headers>] 
    IN ([first pivoted column], [second pivoted column], 
    ... [last pivoted column]) 
) AS <alias for the pivot table> 
<optional ORDER BY clause>; 

sznurkiem, trzeba będzie użyć funkcji zagregowanego MIN() lub MAX(). Problemem, który napotkasz, jest to, że te funkcje zwrócą tylko jedną wartość dla każdej kolumny.

Aby uzyskać poprawne działanie PIVOT, należy podać wyraźną wartość, która spowoduje rozdzielenie wierszy podczas GROUP BY.

Dla przykładu, można użyć row_number():

SELECT ANALYST, CLERK, MANAGER, PRESIDENT, SALESMAN 
from 
(
    SELECT ename, job, 
    row_number() over(partition by job order by ename) rn 
    from emp 
) as st 
pivot 
(
    max(ename) 
    FOR job in (ANALYST, CLERK, MANAGER, PRESIDENT, SALESMAN) 
) as pivottable 

Zobacz SQL Fiddle with Demo.

row_number() tworzy odrębną wartość, która jest przypisana do każdego wiersza w job, po zastosowaniu funkcji zagregowanego i GROUP BY w PIVOT będzie wciąż oddzielne wiersze.