Sql server 2005 如何在SQLServer2005中将多个表中的行转换为具有值的列

Sql server 2005 如何在SQLServer2005中将多个表中的行转换为具有值的列,sql-server-2005,tsql,pivot,Sql Server 2005,Tsql,Pivot,我有一个用户表 第二语言表,包含用户可以说的语言 第三个passport表,其中包含用户的passport详细信息(用户可以有多个passport) [除了这些,我还有5张桌子] 我想将这些语言和passport行转换为列,并将其转换为一个结果集(同时包含用户详细信息),并且在结果集中,根据用户所能说的语言和持有的护照,每个用户记录的语言和passport列应显示是/否值。输出如下所示: 我们可以通过使用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为。谢谢