2013-10-25 13 views
30

Tôi có bảng sau đây nhưng không chắc liệu có thể xoay vòng và giữ lại tất cả các nhãn không.TSQL PIVOT MULTIPLE COLUMNS

RATIO    RESULT SCORE GRADE 
Current Ratio  1.294 60  Good 
Gearing Ratio  0.3384 70  Good 
Performance Ratio 0.0427 50  Satisfactory 
TOTAL    NULL 180  Good 

tôi sẽ thừa nhận không phải là rất tốt với việc sử dụng trụ, vì vậy sau nhiều lần dẫn đến kết quả này:

SELECT 'RESULT' AS 'Ratio' 
    ,[Current Ratio] AS 'Current Ratio' 
    ,[Gearing Ratio] AS 'Gearing Ratio' 
    ,[Performance Ratio] AS 'Performance Ratio' 
    ,[TOTAL] AS 'TOTAL' 
FROM 
(
    SELECT RATIO, RESULT 
    FROM GRAND_TOTALS 
) AS SREC 
PIVOT 
(
    MAX(RESULT) 
    FOR RATIO IN ([Current Ratio],[Gearing Ratio], [Performance Ratio], [TOTAL]) 
) AS PVT 

này cho kết quả:

Ratio Current Ratio Gearing Ratio Performance Ratio 
Result 1.294  0.3384  0.0427 

tôi sẽ thừa nhận cảm thấy rất bối rối về những việc cần làm tiếp theo để tạo ra kết quả tôi cần là:

Ratio Current Ratio Gearing Ratio Performance Ratio TOTAL 
Result  1.294  0.3384    0.0427   NULL 
Score  60    70    50    180 
Grade  Good   Good   Satisfactory   Good 
+0

Bạn đang sử dụng phiên bản máy chủ sql nào? – Taryn

+0

có thể trùng lặp của [Nhiều Cột Pivot trong T-SQL] (http://stackoverflow.com/questions/947281/multiple-column-pivot-in-t-sql) –

Trả lời

39

Vì bạn muốn xoay vòng nhiều cột dữ liệu, trước tiên tôi khuyên bạn nên chia nhỏ các cột result, scoregrade để bạn không có nhiều cột nhưng bạn sẽ có nhiều hàng.

Tùy thuộc vào phiên bản SQL Server của bạn, bạn có thể sử dụng chức năng UNPIVOT hoặc CROSS APPLY. Cú pháp để bỏ ghim dữ liệu sẽ tương tự như:

select ratio, col, value 
from GRAND_TOTALS 
cross apply 
(
    select 'result', cast(result as varchar(10)) union all 
    select 'score', cast(score as varchar(10)) union all 
    select 'grade', grade 
) c(col, value) 

Xem SQL Fiddle with Demo. Khi dữ liệu đã được bỏ chọn, bạn có thể áp dụng chức năng PIVOT:

select ratio = col, 
    [current ratio], [gearing ratio], [performance ratio], total 
from 
(
    select ratio, col, value 
    from GRAND_TOTALS 
    cross apply 
    (
    select 'result', cast(result as varchar(10)) union all 
    select 'score', cast(score as varchar(10)) union all 
    select 'grade', grade 
) c(col, value) 
) d 
pivot 
(
    max(value) 
    for ratio in ([current ratio], [gearing ratio], [performance ratio], total) 
) piv; 

Xem SQL Fiddle with Demo. Điều này sẽ cho bạn kết quả:

| RATIO | CURRENT RATIO | GEARING RATIO | PERFORMANCE RATIO |  TOTAL | 
|--------|---------------|---------------|-------------------|-----------| 
| grade |   Good |   Good |  Satisfactory |  Good | 
| result |  1.29400 |  0.33840 |   0.04270 | (null) | 
| score |  60.00000 |  70.00000 |   50.00000 | 180.00000 | 
+1

Tôi sẽ bị ấn tượng bởi các giải pháp PIVOT của sự thật Các chuyên gia! Tôi tìm thấy điều này ở đây: http://pratchev.blogspot.de/2009/01/pivoting-on-multiple-columns.html. Trong bản pragraph thứ hai, tác giả gợi ý hai mệnh đề PIVOT trong một tuyên bố. là có một nhược điểm này? –

+0

@DerU Nó thực sự phụ thuộc, cá nhân tôi thích tháo rời để dữ liệu ở định dạng dễ dàng hơn sau đó áp dụng hai trụ. – Taryn