2012-03-28 13 views
1

私は、SQL Server 2008で以下のような4つのテーブルがあります。SQL Server 2008のテーブルデータを使用して動的列を作成する方法は?

TABLE 1 - >ユーザー

     UserID  UserName 
        ----------------------- 
         1    Jhon 

TABLE 2 - >電話帳

     PhonebookID  UserID   Name    MobileNumber 
        ------------------------------------------------------------------- 
         1     1    MyBrother    252848 

TABLE 3 - > PhonebookExtraField

     PhonebookExtraFieldID  UserID   ExtraFieldName  
        ------------------------------------------------------------- 
          1      1    Age  
          2      1    Job 
          3      1    Address  

表4 - > phoneBookExtraFieldData

phoneBookExtraFieldDataID PhonebookExtraFieldID PhonebookID ExtraFieldValue  
----------------------------------------------------------------------------------------- 
     101        1     1    30 
     102        2     1    Web Developer 
     103        3     1    A.V. Rose 

どのように私は、以下の出力のためのクエリを記述することができます。
は行うための最善の方法は何か

UserName Phonebook(Name) Phonebook(MobileNumber) Age  Job   Address 
------------------------------------------------------------------------------------- 
Jhon   MyBrother   252848   30 Web Developer A.V. Rose 

...私はテーブルのデータを使用して動的な列を作成するための方法を探しています意味この仕事?
この目的のためにテーブルを変更する必要がありますか?注意と事前のための
感謝...

答えて

2

たぶん、このような何か:

テストデータ

CREATE TABLE #User 
(
    UserID INT, 
    UserName VARCHAR(100) 
) 
INSERT INTO #User 
VALUES(1,'Jhon') 
CREATE TABLE #PhoneBook 
(
    PhonebookID INT, 
    UserID INT, 
    Name VARCHAR(100), 
    MobileNumber INT 
) 
INSERT INTO #PhoneBook 
VALUES(1,1,'MyBrother',252848) 
CREATE TABLE #PhonebookExtraField 
(
    PhonebookExtraFieldID INT, 
    UserID INT, 
    ExtraFieldName VARCHAR(100) 
) 
INSERT INTO #PhonebookExtraField 
VALUES(1,1,'Age'),(2,1,'Job'),(3,1,'Address') 
CREATE TABLE #PhoneBookExtraFieldData 
(
    PhoneBookExtraFieldDataID INT, 
    PhonebookExtraFieldID INT, 
    PhonebookID INT, 
    ExtraFieldValue VARCHAR(100) 
) 
INSERT INTO #PhoneBookExtraFieldData 
VALUES(101,1,1,'30'),(102,2,1,'Web Developer'),(103,3,1,'A.V. Rose') 

動的な列

DECLARE @cols VARCHAR(MAX) 
SELECT @cols = COALESCE(@cols + ','+QUOTENAME(ExtraFieldName), 
        QUOTENAME(ExtraFieldName)) 
FROM 
    #PhonebookExtraField 

見つけるピボットといくつかの動的SQLを実行します。

DECLARE @query NVARCHAR(4000)= 
N'SELECT 
    * 
FROM 
(
    SELECT 
     #User.UserName, 
     #PhoneBook.Name AS [Phonebook(Name)], 
     #PhoneBook.MobileNumber AS [Phonebook(MobileNumber)], 
     #PhonebookExtraField.ExtraFieldName, 
     #PhoneBookExtraFieldData.ExtraFieldValue 
    FROM 
     #User 
     JOIN #PhoneBook 
      ON #User.UserID=#PhoneBook.UserID 
     JOIN #PhonebookExtraField 
      ON #PhoneBook.UserID=#PhonebookExtraField.UserID 
     JOIN #PhoneBookExtraFieldData 
      ON #PhonebookExtraField.PhonebookExtraFieldID=#PhoneBookExtraFieldData.PhonebookExtraFieldID 
) AS p 
PIVOT 
(
    MAX(ExtraFieldValue) 
    FOR ExtraFieldName IN('[email protected]+') 
) AS pvt' 
EXECUTE(@query) 

その後、私は自分の後にクリーンアップします:答えのための

DROP TABLE #User 
DROP TABLE #PhoneBook 
DROP TABLE #PhonebookExtraField 
DROP TABLE #PhoneBookExtraFieldData 
+0

本当にありがとうございました|うーん...私はそれが私が望んでいると思うそれは正確だと思う。それに取り組んで... – MoonLight

+0

問題はない...その答えでうまくいけば、それを受け入れることを検討するかもしれない? – Arion

-1
Select 
    * 
from 
    user as u, 
    PhoneBook as pb, 
    PhonebookExtraField as pbf, 
    phoneBookExtraFieldData as pbdf 
where 
    u.userid=pb.userID 
    and pb.userID=pbf.userID 
    and pbf.PhonebookExtraFieldID =pfbd.PhonebookExtraFieldID 
and u.Username='Jhon' 

は、必要な列名を持つ*交換してください。

+0

おかげで|このクエリーでは、出力ヘッダーとしてAge、Job、Addressが1つもありません。 – MoonLight

+0

@ SilverLightこれで私のクエリを編集しました。 –

関連する問題