2011-08-09 32 views
8

Tôi đang sử dụng Microsoft SQL Server 2008.
Tôi có một bảng mà trông giống như sau:Làm thế nào để Transpose một resultset từ SQL

|======================================================| 
| RespondentId | QuestionId | AnswerValue | ColumnName | 
|======================================================| 
|  P123  |  1  |  Y  | CanBathe | 
|------------------------------------------------------| 
|  P123  |  2  |  3  | TimesADay | 
|------------------------------------------------------| 
|  P123  |  3  |  1.00 | SoapPrice | 
|------------------------------------------------------| 
|  P465  |  1  |  Y  | CanBathe | 
|------------------------------------------------------| 
|  P465  |  2  |  1  | TimesADay | 
|------------------------------------------------------| 
|  P465  |  3  |  0.99 | SoapPrice | 
|------------------------------------------------------| 
|  P901  |  1  |  N  | CanBathe | 
|------------------------------------------------------| 
|  P901  |  2  |  0  | TimesADay | 
|------------------------------------------------------| 
|  P901  |  3  |  0.00 | SoapPrice | 
|------------------------------------------------------| 

Tôi muốn lật hàng là cột để này bảng trông như thế này:

|=================================================| 
| RespondentId | CanBathe | TimesADay | SoapPrice | 
|=================================================| 
|  P123  |  Y |  3 | 1.00 | 
|-------------------------------------------------| 
|  P465  |  Y |  1 | 0.99 | 
|-------------------------------------------------| 
|  P901  |  N |  0 | 0.00 | 
|-------------------------------------------------| 

(dữ liệu ví dụ ở đây là tùy tiện tạo thành, quá ngớ ngẩn của nó)

Bảng nguồn là một bảng tạm thời với khoảng 70.000 hàng.
Tôi cần viết gì để thực hiện điều này?

Cập nhật

  • Tôi thậm chí không biết nếu PIVOT là đúng cách để đi.
  • Tôi không biết cột nào sẽ được PIVOT bật.
  • Tài liệu đề cập đến <aggregation function><column being aggregated> và tôi không muốn tổng hợp bất kỳ thứ gì.

Xin cảm ơn trước.

+2

Bạn đã xem xét 'PIVOT' chưa? http://msdn.microsoft.com/en-us/library/ms177410.aspx –

+0

từ những gì tôi đã thấy về lệnh 'PIVOT', bạn phải sử dụng hàm tổng hợp. Tôi không muốn một hàm tổng hợp, tôi chỉ muốn các giá trị được lật xung quanh. – funkymushroom

Trả lời

7

Bắt buộc phải sử dụng chức năng tổng hợp nếu bạn sử dụng PIVOT. Tuy nhiên, kể từ khi kết hợp (RespondentId, QuestionId) của bạn là duy nhất, bạn "nhóm" sẽ chỉ có một hàng, vì vậy bạn có thể sử dụng MIN() như một chức năng tổng hợp:

SELECT RespondentId, CanBathe, TimesADay, SoapPrice 
FROM (SELECT RespondentId, ColumnName, AnswerValue FROM MyTable) AS src 
PIVOT (MIN(AnswerValue) FOR ColumnName IN(CanBathe, TimesADay, SoapPrice)) AS pvt 

Nếu một nhóm chỉ chứa một hàng, sau đó MIN(value) = value, hoặc trong khác từ: hàm tổng hợp trở thành hàm nhận dạng.

+0

Cảm ơn bạn, điều này đã làm việc hoàn hảo – funkymushroom

1

Xem nếu this giúp bạn bắt đầu. Được sử dụng để có sử dụng các báo cáo CASE để làm cho điều đó xảy ra nhưng có vẻ như một số mực in của PIVOT là trong SQL Server bây giờ.

0

PIVOT là khởi đầu, nhưng vấn đề với truy vấn sql là bạn thực sự cần phải biết những cột nào sẽ mong đợi trong tập hợp kết quả trước khi viết truy vấn. Nếu bạn không biết điều này, lần cuối tôi kiểm tra bạn phải sử dụng sql động hoặc cho phép ứng dụng khách truy xuất dữ liệu để thực hiện xoay vòng thay thế.

+0

Có một số cột cố định (65 - một cho mỗi câu hỏi khảo sát), chỉ là tên của chúng được lưu trữ dưới dạng dữ liệu. – funkymushroom

+0

Trong trường hợp đó, trục xoay phải làm những gì bạn cần, nhưng bạn sẽ phải đặt trong một mục nhập trong danh sách lựa chọn của bạn cho mỗi cột –

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