2013-03-11 8 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 

vorrei formattare il set di risultati in modo tale che ogni lavoro ha la propria colonna:Raggruppamento di stringhe di tabelle pivot sotto la colonna pivot?

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

ho provato

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 

sto ottenendo questi errori

messaggio 156, livello 15, stato 1, riga 7
syn errato imposta vicino alla parola chiave "SELEZIONA".
messaggio 156, livello 15, stato 1, riga 8
Sintassi non corretta vicino alla parola chiave "in".

Come utilizzare pivot per raggruppare le stringhe nella colonna di rotazione?

+0

@Downvoter cura di commentare? Niente è sbagliato nella mia domanda. –

+0

Questa è stata una domanda interessante, ovviamente. +1 da me ... –

risposta

17

Quando si utilizza la funzione PIVOT, è necessario utilizzare una funzione di aggregazione. La sintassi di un PIVOT è:

Da 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>; 

Con una stringa, è necessario utilizzare la funzione di aggregazione MIN() o MAX(). Il problema che si verificherà è che queste funzioni restituiranno un solo valore per ogni colonna.

Quindi, per far funzionare il PIVOT, è necessario fornire un valore distinto che manterrà le righe separate durante lo GROUP BY.

Per esempio, è possibile utilizzare 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 

Vedi SQL Fiddle with Demo.

Il row_number() crea un valore distinto che viene assegnato a ogni riga del job, quando si applica la funzione di aggregazione e l'GROUP BY nel PIVOT sarà comunque ottenere righe separate.