2012-10-27 47 views
8

Tôi có một bảng cho Profiles lưu trữ giá trị hồ sơ tài sản trong phong cách hàng, ví dụ:T: SQL: chọn giá trị từ hàng như cột

[ProfileID]  [PropertyDefinitionID]  [PropertyValue] 
1    6       Jone 
1    7       Smith 
1    8       Mr 
1    3       50000 

và một bảng cho các định nghĩa tài sản:

[PropertyDefinitionID] [PropertyName] 
6      FirstName 
7      LastName 
8      Prefix 
3      Salary 

Cách sử dụng PIVOT hoặc bất kỳ cách nào khác để hiển thị theo cách này:

[ProfileID] [FirstName] [LastName] [Salary] 
1   Jone  Smith  5000 

Trả lời

11

Thật dễ dàng để làm điều này mà không cần PIVOT khoá, chỉ cần bằng cách nhóm

select 
    P.ProfileID, 
    min(case when PD.PropertyName = 'FirstName' then P.PropertyValue else null end) as FirstName, 
    min(case when PD.PropertyName = 'LastName' then P.PropertyValue else null end) as LastName, 
    min(case when PD.PropertyName = 'Salary' then P.PropertyValue else null end) as Salary 
from Profiles as P 
    left outer join PropertyDefinitions as PD on PD.PropertyDefinitionID = P.PropertyDefinitionID 
group by P.ProfileID 

bạn cũng có thể làm điều này với PIVOT từ khóa

select 
    * 
from 
(
    select P.ProfileID, P.PropertyValue, PD.PropertyName 
    from Profiles as P 
     left outer join PropertyDefinitions as PD on PD.PropertyDefinitionID = P.PropertyDefinitionID 
) as P 
    pivot 
    (
     min(P.PropertyValue) 
     for P.PropertyName in ([FirstName], [LastName], [Salary]) 
    ) as PIV 

CẬP NHẬT: Đối với số năng động của bất động sản - hãy nhìn vào Increment value in SQL SELECT statement

+0

Cảm ơn sự đóng góp của bạn, cả hai phương pháp đã giải quyết vấn đề này, tuy nhiên, nếu chúng tôi xem xét hiệu suất, cái nào nhanh hơn? – Alaa

5

Dường như bạn có thể có một số không rõ là PropertyName's mà bạn cần phải chuyển thành cột. Nếu đúng như vậy, bạn có thể sử dụng sql động để tạo kết quả:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(PropertyName) 
        from propertydefinitions 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT profileid, ' + @cols + ' from 
      (
       select p.profileid, 
        p.propertyvalue, 
        d.propertyname 
       from profiles p 
       left join propertydefinitions d 
        on p.PropertyDefinitionID = d.PropertyDefinitionID 
      ) x 
      pivot 
      (
       max(propertyvalue) 
       for propertyname in (' + @cols + ') 
      ) p ' 

execute(@query) 

Xem SQL Fiddle with Demo.

+0

bạn không cần phải sử dụng 'cho xml' khi bạn chỉ cần concat cột vào biến. Cũng có thể có các vấn đề bảo mật khi bạn cố gắng chọn dữ liệu từ bảng, ví dụ, người dùng có thể có quyền trên quy trình, nhưng không có quyền trên bảng. Hãy xem câu trả lời của tôi ở đây - http://stackoverflow.com/questions/13055295/increment-value-in-sql-select-statement/13055403#13055403 –

+1

@RomanPekar có nhiều cách khác nhau để nối các cột, điều này là phương pháp tôi chọn để sử dụng. – Taryn

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