Dynamic 如何在SQLServer2008中使用数据表创建动态列?
在sql server 2008中,我有如下四个表: 表1->用户Dynamic 如何在SQLServer2008中使用数据表创建动态列?,dynamic,sql-server-2008-r2,pivot,Dynamic,Sql Server 2008 R2,Pivot,在sql server 2008中,我有如下四个表: 表1->用户 UserID UserName ----------------------- 1 Jhon 表2->电话簿 PhonebookID UserID Name
UserID UserName
-----------------------
1 Jhon
表2->电话簿
PhonebookID UserID Name MobileNumber
-------------------------------------------------------------------
1 1 MyBrother 252848
表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
做这项工作的最佳方式是什么?为此,我应该如何更改表格?
感谢您的关注和进步
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'
将*替换为所需的列名
将*替换为所需的列名。可能是这样的: 测试数据
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('+@cols+')
) AS pvt'
EXECUTE(@query)
然后我会自己打扫干净:
DROP TABLE #User
DROP TABLE #PhoneBook
DROP TABLE #PhonebookExtraField
DROP TABLE #PhoneBookExtraFieldData
也许是这样的: 测试数据
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('+@cols+')
) AS pvt'
EXECUTE(@query)
然后我会自己打扫干净:
DROP TABLE #User
DROP TABLE #PhoneBook
DROP TABLE #PhonebookExtraField
DROP TABLE #PhoneBookExtraFieldData
感谢您的回答|但是通过此查询,我们的输出中仍然有3行而不是一行。此外,我们没有年龄、职务和地址作为输出标题!感谢您的回答|但是通过此查询,我们的输出中仍然有3行而不是一行。此外,我们没有年龄、职务和地址作为输出标题!非常感谢大家的关注|哇。。。我想这正是我想要的。正在努力…没问题。。。如果你对这个答案很好,那么你可以考虑接受它吗?非常感谢大家的关注。我想这正是我想要的。正在努力…没问题。。。如果你对这个答案很好,那么你可以考虑接受它吗?