Sql server 2005 如何在SQLServer2005中将多个表中的行转换为具有值的列
我有一个用户表 第二语言表,包含用户可以说的语言 第三个passport表,其中包含用户的passport详细信息(用户可以有多个passport) [除了这些,我还有5张桌子] 我想将这些语言和passport行转换为列,并将其转换为一个结果集(同时包含用户详细信息),并且在结果集中,根据用户所能说的语言和持有的护照,每个用户记录的语言和passport列应显示是/否值。输出如下所示: 我们可以通过使用PIVOT来实现这一点。我尝试了使用单个表,但如何对多个表执行此操作 谢谢你能试试吗Sql server 2005 如何在SQLServer2005中将多个表中的行转换为具有值的列,sql-server-2005,tsql,pivot,Sql Server 2005,Tsql,Pivot,我有一个用户表 第二语言表,包含用户可以说的语言 第三个passport表,其中包含用户的passport详细信息(用户可以有多个passport) [除了这些,我还有5张桌子] 我想将这些语言和passport行转换为列,并将其转换为一个结果集(同时包含用户详细信息),并且在结果集中,根据用户所能说的语言和持有的护照,每个用户记录的语言和passport列应显示是/否值。输出如下所示: 我们可以通过使用PIVOT来实现这一点。我尝试了使用单个表,但如何对多个表执行此操作 谢谢你能试试吗
select
*
from
(
select
u.Username, u.department, c.countrypassport
from User U
inner join country C
on C.userid=U.userid
) DataTable
PIVOT
(
SUM(countrypassport)
FOR countrypassport
IN (
[American],[Arabic],.....
)
) PivotTable
也许是这样的:
DECLARE @query NVARCHAR(4000)=
N';WITH CTE
AS
(
SELECT
#tblContryPassport.userid,
''yes'' AS Answer,
#tblContryPassport.contryPassport AS Name
FROM
#tblContryPassport
UNION ALL
SELECT
#tblLanguage.userid,
''yes'' AS Answer,
#tblLanguage.[language] AS Name
FROM
#tblLanguage
)
SELECT
userName,
department,
'+@colsWithIsNull+'
FROM
(
SELECT
#tblUser.userid,
#tblUser.userName,
#tblUser.department,
CTE.Answer,
CTE.Name
FROM
#tblUser
JOIN CTE
ON #tblUser.userid=CTE.userid
) AS p
PIVOT
(
MAX(Answer)
FOR Name IN ('+@cols+')
) AS pvt'
EXECUTE(@query)
首先,测试数据:
CREATE TABLE #tblUser
(
userid INT,
userName VARCHAR(100),
department VARCHAR(100)
)
CREATE TABLE #tblLanguage
(
uniqueid INT,
userid INT,
[language] VARCHAR(100)
)
CREATE TABLE #tblContryPassport
(
uniqueid INT,
userid INT,
contryPassport VARCHAR(100)
)
INSERT INTO #tblUser
VALUES
(1,'aa','TT'),
(2,'bb','gg'),
(3,'cc','rr'),
(4,'dd','dd')
INSERT INTO #tblLanguage
VALUES
(1,1,'American'),
(1,1,'Arabic'),
(1,2,'Azerbaujani'),
(1,3,'Bulgarian'),
(1,3,'Chaochow'),
(1,4,'Behdini')
INSERT INTO #tblContryPassport
VALUES
(1,1,'Hongkong'),
(1,1,'Malaysia'),
(1,2,'Spain'),
(1,3,'China'),
(1,4,'India'),
(1,4,'UK')
然后单击轴的唯一列。如果有两个,则选择其中一个:
DECLARE @cols VARCHAR(MAX),
@colsWithIsNull VARCHAR(MAX)
;WITH CTE
AS
(
SELECT
#tblContryPassport.contryPassport AS Name
FROM
#tblContryPassport
UNION ALL
SELECT
#tblLanguage.[language] AS Name
FROM
#tblLanguage
), CTE2
AS
(
SELECT
ROW_Number() OVER(PARTITION BY name ORDER BY name) AS iRank,
CTE.Name
FROM
CTE
)
SELECT @cols = COALESCE(@cols + ','+QUOTENAME(Name),
QUOTENAME(Name)),
@colsWithIsNull=COALESCE(@colsWithIsNull + ',ISNULL('+QUOTENAME(Name)+',''no'') AS '+QUOTENAME(Name),
'ISNULL('+QUOTENAME(Name)+',''no'') AS '+QUOTENAME(Name))
FROM
CTE2
WHERE
iRank=1
然后执行如下动态轴心:
DECLARE @query NVARCHAR(4000)=
N';WITH CTE
AS
(
SELECT
#tblContryPassport.userid,
''yes'' AS Answer,
#tblContryPassport.contryPassport AS Name
FROM
#tblContryPassport
UNION ALL
SELECT
#tblLanguage.userid,
''yes'' AS Answer,
#tblLanguage.[language] AS Name
FROM
#tblLanguage
)
SELECT
userName,
department,
'+@colsWithIsNull+'
FROM
(
SELECT
#tblUser.userid,
#tblUser.userName,
#tblUser.department,
CTE.Answer,
CTE.Name
FROM
#tblUser
JOIN CTE
ON #tblUser.userid=CTE.userid
) AS p
PIVOT
(
MAX(Answer)
FOR Name IN ('+@cols+')
) AS pvt'
EXECUTE(@query)
然后在我的情况下,我将删除临时表:
DROP TABLE #tblUser
DROP TABLE #tblContryPassport
DROP TABLE #tblLanguage
很乐意帮忙。。快乐编码:P@Arion:我再次需要你的帮助。请看“与其他表进一步移动”标签后的更新问题。是的,我认为这将很难获得输出,因为正如你所说,你没有任何关系。您所做的编辑是一个新问题,因此如果您想要新答案。问一个新问题。我问了一个新问题,并将其从该问题中删除。请记住当前场景,因为我需要在回答新问题时将该解决方案合并到此解决方案。新问题的URL为。谢谢