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

我得到这些错误

Msg 156,Level 15,State 1,Line 7
错误的同步在关键字'SELECT'附近收税。
Msg 156,Level 15,State 1,Line 8
关键字'in'附近的语法不正确。

如何使用透视将字符串分组在透视列下?

+0

@Downvoter关心评论?我的问题没有什么是错的。 – 2013-05-07 13:44:51

+0

当然,这是一个有趣的问题。来自我的+1 ... – 2016-07-01 04:20:40

回答

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()聚合函数。您将遇到的问题是这些函数将只为每列返回一个值。

因此,要使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,当你应用聚合函数,并在PIVOT你仍然会得到不同的行的GROUP BY一个独特的价值。