Reputation: 20468
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
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
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