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

Tôi muốn để định dạng tập hợp kết quả như vậy mà mỗi công việc được cột riêng của mình:Tạo chuỗi bảng nhóm trong cột trụ?

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

tôi đã cố gắng

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 

tôi nhận được các lỗi này

Msg 156, Cấp 15, Tiểu bang 1, Dòng 7
Đồng bộ hóa không chính xác thuế gần từ khóa 'CHỌN'.
Msg 156, Level 15, State 1, Line 8
Cú pháp không chính xác gần từ khóa 'trong'.

Làm cách nào để sử dụng trục xoay để nhóm chuỗi dưới cột trụ?

+0

@Downvoter care for comment? Không có gì sai trong câu hỏi của tôi. –

+0

Đây là một câu hỏi thú vị, tất nhiên. +1 từ tôi ... –

Trả lời

17

Khi bạn đang sử dụng chức năng PIVOT, bạn được yêu cầu sử dụng hàm tổng hợp. Cú pháp của một PIVOT là:

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

Với một chuỗi, bạn sẽ cần phải sử dụng một trong hai MIN() hoặc MAX() chức năng tổng hợp. Vấn đề mà bạn sẽ gặp phải là các hàm này sẽ chỉ trả về một giá trị cho mỗi cột.

Vì vậy, để có được PIVOT hoạt động, bạn sẽ cần phải cung cấp một giá trị riêng biệt sẽ giữ cho các hàng riêng biệt trong suốt GROUP BY.

Ví dụ, bạn có thể sử dụng 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 

Xem SQL Fiddle with Demo.

Các row_number() tạo ra một giá trị riêng biệt mà được gán cho mỗi hàng trong job, khi bạn áp dụng các chức năng tổng hợp và GROUP BY trong PIVOT bạn vẫn sẽ nhận được hàng riêng biệt.

Các vấn đề liên quan