2012-03-01 12 views
1

1つのユーザーテーブルがあります。ユーザが複数のテーブルの行をSQL​​ Server 2005の値を持つ列に変換する方法

enter image description here

、ユーザのパスポートの詳細を含む第三のパスポートテーブル(ユーザが複数のパスポートを持つことができる)

enter image description hereを話すことができる言語が含ま

enter image description here

及び第二言語テーブル

[私は5mこれら以外の鉱石のテーブル]

これらの言語とパスポートの行を1つの結果セット(ユーザーの詳細も含む)に変換し、結果セットには、すべての言語とパスポートの列にはい/いいえの値が表示されます。話すことができると下記の通り、彼らは何のパスポートになりhave.Outputどの言語のユーザーに応じて、ユーザレコード:

enter image description here

我々はPIVOT.Iを使用することによってこれを行うことができますが、単一のテーブルと試みたが、ためにそれを行う方法複数のテーブル。

おかげ

答えて

2

を試すことができます:ピボットのためのユニークなコラムCONCATその後

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 @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, 
    '[email protected]+' 
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 ('[email protected]+') 
) AS pvt' 

EXECUTE(@query) 

DROP TABLE #tblUser 
DROP TABLE #tblContryPassport 
DROP TABLE #tblLanguage 
+0

おかげでこのようなダイナミックなピボットを行うその後

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 

:2がある場合は、それらのいずれかを選択します。アリオン。素早く解決してくれてありがとう。 – Sukhjeevan

+0

それは私が必要としていたものです。 – Sukhjeevan

+0

ハッピーコーディング:P – Arion

0

あなたはたぶん、このような何か

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 
関連する問題