SilverLight
SilverLight

Reputation: 20468

how create dynamic columns using tables data in sql server 2008?

i have four tables like below in sql server 2008 :

TABLE 1 -> Users

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

TABLE 2 -> PhoneBook

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

TABLE 3 -> PhonebookExtraField

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

TABLE 4 -> phoneBookExtraFieldData

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

how can i write a query for output below :
mean i am looking for a way for creating dynamic columns using Tables data...

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

what is the best way for doing this job?
how should i change my tables for this purpose?
thanks for attention and advance...

Upvotes: 1

Views: 8239

Answers (2)

Mulesoft Developer
Mulesoft Developer

Reputation: 2824

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'

Replace * with required column names.

Upvotes: -1

Arion
Arion

Reputation: 31249

Maybe something like this:

Test data

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')

The find the dynamic columns

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

The execute some dynamic sql with a Pivot:

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('+@cols+')
) AS pvt'
EXECUTE(@query)

Then I will clean up after myself:

DROP TABLE #User
DROP TABLE #PhoneBook
DROP TABLE #PhonebookExtraField
DROP TABLE #PhoneBookExtraFieldData

Upvotes: 2

Related Questions