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

私は、各ジョブが独自の列を取得するように設定し、結果をフォーマットしたいと思います:ピボット・テーブル・ストリングはピボット・カラムの下でグループ化されていますか?

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

私はこれらのエラーに

を取得しています

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 

を試してみましたメッセージ156、レベル15、状態1、行7
誤ったsynキーワード「SELECT」の近くの税。
メッセージ156、レベル15、状態1、行8
'in'キーワードの構文が正しくありません。ピボット列の下にグループ文字列にピボットを使用する方法

+0

@Downvoterさんのコメントはありますか?私の質問に間違いはありません。 –

+0

これはもちろん興味深い質問でした。私の+1 ... –

答えて

17

PIVOT関数を使用している場合は、集計関数を使用する必要があります。 PIVOTの構文は次のとおりです。

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

文字列では、あなたはどちらかMIN()またはMAX()集約関数を使用する必要があります。これらの関数は各列に対して1つの値しか返さないという問題があります。

PIVOTを機能させるには、GROUP BYの間に行を分けておく別個の値を指定する必要があります。ご例えば

、あなたは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 

SQL Fiddle with Demoを参照してください。

row_number()は、jobの各行に割り当てられた個別の値を作成します。のGROUP BYには別の行が割り当てられます。

関連する問題