SQL Server: Ví dụ về dữ liệu Chuỗi PIVOTing


124

Đang cố gắng tìm một số ví dụ PIVOT SQL Server đơn giản. Hầu hết các ví dụ mà tôi đã tìm thấy liên quan đến việc đếm hoặc tổng hợp số. Tôi chỉ muốn xoay vòng một số dữ liệu chuỗi. Ví dụ, tôi có một truy vấn trả về như sau.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

Tôi muốn sử dụng PIVOT (nếu có thể) để tạo ra kết quả như vậy:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

Điều này thậm chí có thể với chức năng PIVOT?



Hãy xem liên kết này: dotnetgalactics.wordpress.com/2009/10/23/ Có thể hữu ích;)
Pato

Bạn có thể thấy liên kết này nếu số lượng các mục riêng biệt không xác định, có nghĩa là không có cột nào sau khi xoay vòng là động. Pivot Server SQL: Chuyển đổi hàng thành cột với truy vấn động
maeenul

Câu trả lời:


164

Hãy nhớ rằng hàm tổng hợp MAX sẽ hoạt động trên văn bản cũng như số. Truy vấn này sẽ chỉ yêu cầu quét bảng một lần.

SELECT Action,
       MAX( CASE data WHEN 'View' THEN data ELSE '' END ) ViewCol, 
       MAX( CASE data WHEN 'Edit' THEN data ELSE '' END ) EditCol
 FROM t
 GROUP BY Action

+1 Anh bạn ... bạn thực sự là một thiên tài. Tôi ước mình có thể biết điều này sớm hơn, thay vì phải học cách PIVOT!
tro999

@ Silmaril89 giả sử rằng tên cột thứ 2 trong câu hỏi là 'dữ liệu' và cột thứ nhất là 'Hành động'
Iman

1
Có bất kỳ lý do tại sao tôi không nên sử dụng ...ELSE NULL END...thay vì ...ELSE '' END...?
mo.

15
Cái nào nhanh hơn, cái này hay PIVOT?
Robert Jeppesen

Whoah, bạn chỉ cần thổi tâm trí của tôi. Trong đầu tôi đã có ý tưởng về những gì tôi mặc dù máy chủ SQL "chỉ nên làm điều đó!", Nhưng nghĩ rằng nó không thể được thực hiện. Sau đó, tôi đã thấy điều này.
David Hay

54

Thiết lập bảng:

CREATE TABLE dbo.tbl (
    action VARCHAR(20) NOT NULL,
    view_edit VARCHAR(20) NOT NULL
);

INSERT INTO dbo.tbl (action, view_edit)
VALUES ('Action1', 'VIEW'),
       ('Action1', 'EDIT'),
       ('Action2', 'VIEW'),
       ('Action3', 'VIEW'),
       ('Action3', 'EDIT');

Bảng của bạn: SELECT action, view_edit FROM dbo.tbl

Bảng của bạn

Truy vấn mà không sử dụng PIVOT:

SELECT Action, 
[View] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'VIEW'),
[Edit] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'EDIT')
FROM tbl t
GROUP BY Action

Truy vấn bằng PIVOT:

SELECT [Action], [View], [Edit] FROM
(SELECT [Action], view_edit FROM tbl) AS t1 
PIVOT (MAX(view_edit) FOR view_edit IN ([View], [Edit]) ) AS t2

Cả hai kết quả truy vấn:
nhập mô tả hình ảnh ở đây


Cảm ơn câu trả lời hiếm, rõ ràng này. nó ngay lập tức hiển thị một ví dụ và các bộ dữ liệu kết quả
real_yggdrasil

Tôi biết điều này là cũ, nhưng đây là minh chứng trục rõ ràng nhất, minh họa tốt nhất mà tôi đã thấy.
Stan Shaw

52

Nếu bạn đặc biệt muốn sử dụng hàm SQL Server PIVOT, thì điều này sẽ hoạt động, giả sử hai cột ban đầu của bạn được gọi là hành động và cmd. (Không phải là đẹp để nhìn mặc dù.)

SELECT act AS 'Action', [View] as 'View', [Edit] as 'Edit'
FROM (
    SELECT act, cmd FROM data
) AS src
PIVOT (
    MAX(cmd) FOR cmd IN ([View], [Edit])
) AS pvt


6

Vâng, đối với mẫu của bạn và bất kỳ với số lượng cột duy nhất có giới hạn, điều này sẽ làm điều đó.

select 
    distinct a,
    (select distinct t2.b  from t t2  where t1.a=t2.a and t2.b='VIEW'),
    (select distinct t2.b from t t2  where t1.a=t2.a and t2.b='EDIT')
from t t1

5
With pivot_data as
(
select 
action, -- grouping column
view_edit -- spreading column
from tbl
)
select action, [view], [edit]
from   pivot_data
pivot  ( max(view_edit) for view_edit in ([view], [edit]) ) as p;

0

Tôi đã có một tình huống khi tôi phân tích chuỗi và hai vị trí đầu tiên của chuỗi được đề cập sẽ là tên trường của một tiêu chuẩn mã hóa yêu cầu chăm sóc sức khỏe. Vì vậy, tôi sẽ loại bỏ các chuỗi và nhận các giá trị cho F4, UR và UQ hoặc không có gì. Điều này thật tuyệt vời trên một bản ghi hoặc một vài bản ghi cho một người dùng. Nhưng khi tôi muốn xem hàng trăm bản ghi và các giá trị cho tất cả người dùng thì nó cần phải là PIVOT. Điều này thật tuyệt vời đặc biệt khi xuất rất nhiều hồ sơ để xuất sắc. Yêu cầu báo cáo cụ thể mà tôi đã nhận được là "mỗi khi ai đó gửi khiếu nại cho Benadryl, họ đã gửi giá trị nào trong các trường F4, UR và UQ. Tôi đã có một ỨNG DỤNG NGOÀI tạo ra ColTitle và các trường giá trị bên dưới

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.