2017-04-20 14 views
0

TENANT、ROOMMATEおよびPERSONレコードを格納する3つのテーブルがあります。SQL Server 2008 - ピボットのない列に行アイテムを表示

スキーマは以下の通りです:

Table: Tenant 
HMYPERSON SCODE sFirstName sLastName 
     1 t0011 fName  lName 

Table: room 
HMYPERSON HMYTENANT sRelationShip 
    9458   1 Roommate 
    1024   1 Other 
    1025   1 Roommate 
    1026   1 Guarantor 

Table: Person 
HMY  UCODE ULASTNAME sFIRSTNAME  iPersonType 
9458 r0011 roommate1 roommate1Fname 93 
1024 r0012 roommate2 roommate2Fname 93 
1025 r0013 roommate3 roommate3Fname 93 
1026 r0014 roommate4 roommate4Fname 90 

テナントテーブルには、テナントのレコードが含まれています。 ROOMテーブルには、乗員レコードが含まれています。 人のテーブルには、ROOMテーブル内のすべてのそれの人々の種類(テナント、ルームメイト、ベンダーなど)

HMYTENANTが含まれているROOMテーブル内のテナントテーブルの外部キー(HMYPERSON)

HMYPERSONは外部キーですPERSONテーブル(HMY)

PERSONテーブルのIPERSONTYPEは、どのタイプの人物レコードであるかを指定します。 (93名はルームメイト、90名は保証人)

すべてのテナントとそのルームメイト名を1行に表示したい。 すべてのルームメイトは、同じ行と別々の列に表示する必要があります。 (ルームメイトごとに1列)

私はルームメートのリストを私に提供するクエリを書いています。ここで

は、私が書いたものです:

Select t.scode, t.sLastname + ' ' + t.sFIRSTNAME TenantName, p.ULASTNAME + ' ' + p.sFIRSTNAME RoommateName 
from tenant t 
join room r on r.hmytenant = t.hmyperson 
left join person p on p.hmy = r.hmyperson and (r.sRelationship <> 'Guarantor' or p.IPERSONTYPE<>90) 
where t.hmyperson=1 

これは私に以下のように出力できます:

scode Tenantname  RoommateName 
t0011 lName fName  roommate1 roommate1Fname 
t0011 lName fName  roommate2 roommate2Fname 
t0011 lName fName  roommate3 roommate3Fname 

をしかし、私はそれが好きたい:

scode  Tenantname  Roommate1  Roommate2  Roommate3 

5人のルームメイトまでです十分。

あなたのお手伝いをお待ちしております。

+0

を参照してください:http://modern-sql.com/use-case/pivot –

答えて

0

これを試すことができますか?

WITH A AS (SELECT HMYPERSON, HMYTENANT, SRELATIONSHIP, P.ULASTNAME, p.SFIRSTNAME, ROW_NUMBER() OVER (PARTITION BY HMYTENANT ORDER BY HMYPERSON) AS RN 
      FROM ROOM R 
      INNER JOIN PERSON P ON P.HMY = R.HMYPERSON 
           AND (R.SRELATIONSHIP <> 'Guarantor' OR P.IPERSONTYPE<>90)   
      ) 
SELECT T.SCODE, T.SLASTNAME + ' ' + T.SFIRSTNAME TENANTNAME 
     , A1.ULASTNAME + ' ' + A1.SFIRSTNAME ROOMMATENAME_1 
     , A2.ULASTNAME + ' ' + A2.SFIRSTNAME ROOMMATENAME_2 
     , A3.ULASTNAME + ' ' + A3.SFIRSTNAME ROOMMATENAME_3 
     , A4.ULASTNAME + ' ' + A4.SFIRSTNAME ROOMMATENAME_4 
     , A5.ULASTNAME + ' ' + A5.SFIRSTNAME ROOMMATENAME_5 
FROM TENANT T 
LEFT JOIN A A1 ON A1.HMYTENANT = T.HMYPERSON AND A1.RN=1 
LEFT JOIN A A2 ON A2.HMYTENANT = T.HMYPERSON AND A2.RN=2 
LEFT JOIN A A3 ON A3.HMYTENANT = T.HMYPERSON AND A3.RN=3 
LEFT JOIN A A4 ON A4.HMYTENANT = T.HMYPERSON AND A4.RN=4 
LEFT JOIN A A5 ON A5.HMYTENANT = T.HMYPERSON AND A5.RN=5 
WHERE T.HMYPERSON=1 

出力:

SCODE TENANTNAME ROOMMATENAME_1   ROOMMATENAME_2   ROOMMATENAME_3   ROOMMATENAME_4   ROOMMATENAME_5 
----- ----------- ------------------------ ------------------------ ------------------------ ------------------------ ------------------------ 
t0011 lName fName roommate2 roommate2Fname roommate3 roommate3Fname roommate1 roommate1Fname NULL    NULL 
関連する問題