10
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
キーワード「SELECT」付近の構文が正しくありません。
メッセージ 156、レベル 15、状態 1、行 8
キーワード「in」付近の構文が正しくありません。

ピボットを使用してピボット列の下に文字列をグループ化する方法は?

4

1 に答える 1

20

このPIVOT関数を使用する場合は、集計関数を使用する必要があります。aの構文は次のとおり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()文字列を使用する場合は、 orまたはMAX()aggregate関数を使用する必要があります。遭遇する問題は、これらの関数が各列に対して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 FiddlewithDemoを参照してください。

は、のrow_number()各行に割り当てられる個別の値を作成しjobます。集計関数を適用すると、GROUP BYPIVOT引き続き個別の行を取得します。

于 2013-03-11T11:25:07.350 に答える