2012-06-11 48 views
5

Với hai bảng mẫu ở đây:SQL: xem động với tên cột dựa trên các giá trị cột trong bảng nguồn

Vé Bảng

ID User Description 

0 James This is a support ticket 
1 Fred This is a ticket too 

Thuộc tính Bảng

ID TicketID Label   Value 

0 0   Engineer  Scott 
1 1   Engineer  Dale 
2 0   Manu   Dell 
3 1   Manu   HP 
4 0   OS    Windows 
5 1   OS    Linux 

Làm thế nào tôi có thể đến một cái nhìn như thế này:

ID User Description     Engineer Manu OS 

1 James This is a support ticket Scott  Dell Windows 
2 Fred This is a ticket too  Dale  HP  Linux 

Điều quan trọng cần lưu ý là bảng thuộc tính không phải lúc nào cũng giống nhau. Một số "Vé" có thể có các thuộc tính mà những người khác không có.

Điều này có thể thực hiện được không?

+2

Bảng thuộc tính là ma quỷ. –

+0

@Jeremy để có thể mã hóa tên thuộc tính cứng dưới dạng tên cột. Cả hai đều có vị trí của họ. –

+0

@AaronBertrand, một lần nữa tôi không đồng ý với bạn ... nhưng mỗi khi tôi phải sử dụng các bảng thuộc tính, tôi hầu như luôn có vấn đề về hiệu suất, và chúng thường là một cơn đau ở mông. –

Trả lời

11

Bạn có thể thực hiện việc này với PIVOT. Khi thực hiện PIVOT, bạn có thể thực hiện theo một trong hai cách, với Pivot tĩnh, bạn sẽ mã hóa các hàng để chuyển đổi hoặc một Pivot động sẽ tạo danh sách các cột tại thời gian chạy:

Static Pivot (Xem SQL Fiddle for Demo):

select id, [user], [engineer], [manu], [OS] 
from 
(
    select t.id 
     , t.[user] 
     , p.ticketid 
     , p.label 
     , p.value 
    from tickets t 
    inner join properties p 
     on t.id = p.ticketid 
) x 
pivot 
(
    min(value) 
    for label in ([engineer], [manu], [OS]) 
) p 

Hoặc bạn có thể sử dụng một Pivot động (Xem SQL Fiddle for Demo):

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(p.label) 
        from tickets t 
        inner join properties p 
         on t.id = p.ticketid 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT id, [user], ' + @cols + ' from 
      (
       select t.id 
         , t.[user] 
         , p.ticketid 
         , p.label 
         , p.value 
        from tickets t 
        inner join properties p 
         on t.id = p.ticketid 
      ) x 
      pivot 
      (
       min(value) 
       for label in (' + @cols + ') 
      ) p ' 

execute(@query) 

Cả hai truy vấn sẽ trả lại kết quả tương tự.

+0

ví dụ đầu tiên của bạn phức tạp hơn nhiều so với kết quả chính xác của tôi và ví dụ thứ hai ... sql động? Trước khi đi tuyến đường đó, tôi nghĩ bạn muốn chắc chắn rằng đó là một yêu cầu và làm thế nào để bàn được tiêu thụ. –

+0

Bạn là người hùng mới của tôi. Tôi muốn có con của bạn. (Dynamic Pivot hoạt động chính xác như thế nào tôi cần) –

+1

@JeremyHolovacs Tôi không đồng ý rằng lần đầu tiên phức tạp hơn phiên bản của bạn với 3 lần gia nhập trái. Theo như phiên bản động, OP yêu cầu phiên bản động của truy vấn sẽ linh hoạt và đó là những gì tôi đã cung cấp. Luôn luôn có nhiều cách khác để trả lời câu hỏi, vui lòng đề xuất một cách năng động khác. :) – Taryn

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