枢轴列下的数据透视表字符串分组?

mr_*_*air 9 sql sql-server pivot pivot-table sql-server-2008

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
Run Code Online (Sandbox Code Playgroud)

我想格式化结果集,以便每个作业都有自己的列:

CLERKS  ANALYSTS  MGRS   PREZ  SALES
------  --------  -----  ----  ------
MILLER  FORD      CLARK  KING  TURNER
JAMES   SCOTT     BLAKE        MARTIN
ADAMS             JONES        WARD
SMITH 
Run Code Online (Sandbox Code Playgroud)

我试过了

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
Run Code Online (Sandbox Code Playgroud)

我收到这些错误

消息156,级别15,状态1,行7
关键字'SELECT'附近的语法不正确.
消息156,级别15,状态1,行8
关键字'in'附近的语法不正确.

如何使用数据透视表在枢轴列下分组字符串?

Tar*_*ryn 18

使用该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>;
Run Code Online (Sandbox Code Playgroud)

使用字符串,您将需要使用MIN()MAX()聚合函数.您将遇到的问题是这些函数将为每列返回一个值.

因此,为了使其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
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.

row_number()创建分配给每个行中的一个独特的价值job,当你申请的聚合函数和,GROUP BYPIVOT你仍然会得到不同的行.