1

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...

2 Answers 2

2

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
Sign up to request clarification or add additional context in comments.

2 Comments

really thanks for attention | woh... i think it's exactly that i want.working on it...
No problem... If you are fine with that answer then you might consider accepting it?
-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'

Replace * with required column names.

1 Comment

thanks for answer | but with this query we still have 3 rows in output instead of one.also we do n't have Age , Job And Address as output Headers!

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.