Sql server SQL Server 2008-在不带透视的列中显示行项目
我有三张桌子:房客、室友和个人记录 模式如下所示:Sql server SQL Server 2008-在不带透视的列中显示行项目,sql-server,sql-server-2008,Sql Server,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
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
租户表包含租户记录。
房间的桌子上有记录。
PERSON表包含所有类型的人(租户、室友、供应商等)
HMYTENANT in ROOM table是租户表(HMYPERSON)的外键
HMYPERSON in ROOM table是PERSON table(HMY)的外键
PERSON表中的IPERSONTYPE指定它是什么类型的PERSON记录。(93是室友,90是担保人)
我想在一行中显示所有房客及其室友的姓名。
所有室友应显示在同一行和单独的列中。
(每个室友一列)
我写了一个查询,给出了我的室友名单,但是是成排的
以下是我写的:
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 Roommate1 Roommate2 Roommate3
最多5个室友就足够了
谢谢你的帮助。你能试试这个吗
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
见:
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