2013-03-08 47 views
13

tôi cần phải làm như sau transpose trong MS SQLSQL transpose đầy đủ bảng

từ:

Day A B 
--------- 
Mon 1 2 
Tue 3 4 
Wed 5 6 
Thu 7 8 
Fri 9 0 

Để sau:

Value Mon Tue Wed Thu Fri 
-------------------------- 
A  1 3 5 7 9 
B  2 4 6 8 0 

Tôi hiểu làm thế nào để làm điều đó với PIVOT khi chỉ có một cột (A) nhưng tôi không thể tìm ra cách thực hiện khi có nhiều cột để chuyển đổi (A, B, ...)

Ví dụ mã được hoán:

select LEFT(datename(dw,datetime),3) as DateWeek, 
    sum(ACalls) as A, 
    Sum(BCalls) as B 
from DataTable 
group by LEFT(datename(dw,datetime),3) 

Bảng Cấu trúc:

Column DataType 
DateTime Datetime 
ACalls int 
BCalls int 

Bất kỳ trợ giúp sẽ được nhiều đánh giá cao.

+0

có thể trùng lặp của [Cách đơn giản để transpose cột và hàng trong Sql?] (Http: // stackoverflow.com/questions/13372276/simple-way-to-transpose-columns-and-rows-in-sql) –

Trả lời

22

Để chuyển dữ liệu vào kết quả bạn muốn, bạn sẽ cần phải sử dụng cả các chức năng UNPIVOTPIVOT.

Chức năng UNPIVOT lấy các cột AB và chuyển đổi kết quả thành các hàng. Sau đó, bạn sẽ sử dụng PIVOT chức năng để chuyển đổi day giá trị vào cột:

select * 
from 
(
    select day, col, value 
    from yourtable 
    unpivot 
    (
    value 
    for col in (A, B) 
) unpiv 
) src 
pivot 
(
    max(value) 
    for day in (Mon, Tue, Wed, Thu, Fri) 
) piv 

Xem SQL Fiddle with Demo.

Nếu bạn đang sử dụng SQL Server 2008+, thì bạn có thể sử dụng CROSS APPLY với VALUES để bỏ xoay vòng dữ liệu. Mã của bạn sẽ được thay đổi thành:

select * 
from 
(
    select day, col, value 
    from yourtable 
    cross apply 
    (
    values ('A', A),('B', B) 
) c (col, value) 
) src 
pivot 
(
    max(value) 
    for day in (Mon, Tue, Wed, Thu, Fri) 
) piv 

Xem SQL Fiddle with Demo.

Chỉnh sửa # 1, áp dụng truy vấn hiện tại của bạn vào các giải pháp trên, bạn sẽ sử dụng một cái gì đó tương tự như sau:

select * 
from 
(
    select LEFT(datename(dw,datetime),3) as DateWeek, 
    col, 
    value 
    from DataTable 
    cross apply 
    (
    values ('A', ACalls), ('B', BCalls) 
) c (col, value) 
) src 
pivot 
(
    sum(value) 
    for dateweek in (Mon, Tue, Wed, Thu, Fri) 
) piv 
+0

Cảm ơn câu trả lời nhanh. Tôi không thể quản lý để làm trục xoay cho truy vấn sau: chọn LEFT (datename (dw, datetime), 3) như DateWeek, SUM (ACalls) là A, SUM (BCalls) là B từ _online_interval_data group by LEFT (datename (dw , datetime), 3) Unpivot (= Cú pháp không chính xác gần từ khóa 'Unpivot') – Selrac

+0

Tôi đang sử dụng SQL2008 R2. Lỗi vấn đề tương tự với Cross áp dụng -> chọn LEFT (datename (dw, datetime), 3) là DateWeek, SUM (ACalls) là A, SUM (BCalls) dưới dạng B từ dữ liệu nhóm bằng LEFT (datename (dw, datetime), 3) áp dụng chéo (= Cú pháp sai gần từ khóa 'gạch chéo') – Selrac

+0

@ user2148939 Tôi không hiểu mã mà bạn đã đăng. Vui lòng chỉnh sửa bài đăng gốc của bạn bằng cấu trúc bảng và sau đó là mã bạn đang sử dụng. – Taryn

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