2010-01-31 30 views
11

Tôi có một bảng trông như thế này:SQL Server Pivot có thể không biết tên cột kết quả không?

Month  Site   Val 
2009-12 Microsoft  10 
2009-11 Microsoft  12 
2009-10 Microsoft  13 
2009-12 Google   20 
2009-11 Google   21 
2009-10 Google   22 

Và tôi muốn có được một bảng 2 chiều mà mang lại cho tôi những "Val" trong tháng của mỗi trang web, như:

Month  Microsoft  Google 
2009-12  10   20 
2009-11  12   21 
2009-10  13   22 

Nhưng bắt được, tôi không biết tất cả các giá trị có thể có trong "Trang web". Nếu một trang mới xuất hiện, tôi muốn tự động lấy một cột mới trong bảng kết quả của tôi.

Tất cả các mẫu mã tôi thấy có thể làm điều này yêu cầu tôi phải mã hóa "Microsoft và Google" trong văn bản truy vấn.
I saw one that didn't, nhưng về cơ bản nó giả mạo nó bằng cách liệt kê các trang web và tạo truy vấn khi đang di chuyển (concatting một chuỗi) có các tên cột trong đó.

Không có cách nào để có được SQL Server 2008 để làm điều này mà không có một hack như thế?

LƯU Ý: Tôi cần để có thể chạy điều này như một truy vấn mà tôi gửi từ ASP.Net, tôi không thể thực hiện các thủ tục được lưu trữ hoặc các nội dung khác như thế.

Cảm ơn!
Daniel

+0

gì bạn đang tìm kiếm nên có thể bằng cách thực hiện truy vấn tại thời gian chạy bằng cách sử dụng 'exec (@sql)' xem [ở đây] (http://stackoverflow.com/questions/15752112/). – surfmuggle

Trả lời

6

Ví dụ bạn đã liên kết đến sử dụng SQL động. Thật không may, không có phương thức tích hợp sẵn khác để xoay vòng trong SQL Server khi các cột đầu ra không được biết trước.

Nếu dữ liệu không quá lớn, có lẽ đơn giản nhất là chỉ cần chạy truy vấn hàng bình thường từ ASP.NET và thực hiện trục của bạn trong mã ứng dụng. Nếu dữ liệu là rất lớn, thì bạn sẽ phải tạo SQL động sau khi truy vấn đầu tiên cho các giá trị cột có thể.

Lưu ý rằng bạn không thực sự cần viết một câu lệnh SQL tạo SQL động; bạn có thể chỉ cần tạo SQL trong ASP.NET, và điều đó rất có thể sẽ dễ dàng hơn nhiều. Chỉ cần đừng quên để thoát khỏi các giá trị Site riêng biệt trước khi nhét chúng trong một truy vấn được tạo ra, và đừng quên tham số hóa bất kỳ phần nào của câu lệnh SQL mà bạn thường làm nếu không có trục.

-1

chọn tháng, min (trường hợp trang web khi 'microsoft'then cuối val) microsoft, min (trường hợp trang web khi' google'then cuối val) google từ withoutpivot nhóm theo tháng

select main.month, 
m.val as microsoft, 
g.val as google 
from withoutpivot main 
inner join withoutpivot m on m.month=main.month 
inner join withoutpivot g on g.month=main.month 
where m.site='microsoft' 
and g.site='google' 
Các vấn đề liên quan