SQL语句问题:我有两个表PARENT和STUDENTS。
ParentID | FName | LName | StudentID
---------+-------+-------+----------
1 | John | Doe | 11
1 | John | Doe | 12
2 | Jane | Doe | 11
2 | Jane | Doe | 12
3 | Joe | Dirt | 13StudentID | FName | LName
----------+---------+------
11 | Janet | Doe
12 | Jackson | Doe
13 | Jane | DirtParentID | FName | LName | StudentID1 | Student1FName | StudentID2 | Student2FName |...
---------+-------+-------+------------+---------------+------------+---------------+---
1 | John | Doe | 11 | Janet | 12 | Jackson
2 | Jane | Doe | 11 | Janet | 12 | Jackson
3 | Joe | Dirt | 13 | Jane | NULL | NULL 我想要两个表的输出,但有时家长可能有两个以上的学生,有些可能只有一个。
我如何才能达到预期的结果集,但仍然灵活的学生在每个家长人数?
注:我对每个家长的学生人数没有一个明确的上限。
发布于 2018-09-16 07:32:33
这是一个解决方案,但在这个特殊情况下,每个家长的学生数量有限。我为3名学生写了这个查询。
with cteParent ( ParentID, FName, LName, StudentID )
as (
select 1, 'John', 'Doe', 11
union all select 1, 'John', 'Doe', 12
union all select 2, 'Jane', 'Doe', 11
union all select 2, 'Jane', 'Doe', 12
union all select 3, 'Joe', 'Dirt', 13
) ,
cteStudent ( StudentID, FName, LName )
as (
select 11, 'Janet', 'Doe'
union all select 12, 'Jackson', 'Doe'
union all select 13, 'Jane', 'Dirt'
) ,
cteParentNumbered
as (
select p.ParentID
, p.FName
, p.LName
, p.StudentID
, row_number() over (partition by p.ParentID order by p.StudentID) as StudentNum
from cteParent p
)
select
pvt.ParentID
, pvt.FName
, pvt.LName
, s1.StudentID as Student1Id
, s1.FName as Student1FName
, s2.StudentID as Student2Id
, s2.FName as Student2FName
, s3.StudentID as Student3Id
, s3.FName as Student3FName
from cteParentNumbered p
pivot ( min (StudentID) FOR StudentNum IN ( [1], [2], [3] /*... add more if needed */ ) ) AS pvt
left join cteStudent as s1 on s1.StudentID = pvt.[1]
left join cteStudent as s2 on s2.StudentID = pvt.[2]
left join cteStudent as s3 on s3.StudentID = pvt.[3]
--... you can add more if needed要消除每个家长对学生的限制,您应该动态构建sql查询并通过服务提供商_执行者运行它,但它没有实际用途。这通常由客户端应用程序和/或报表引擎处理。例如,它可以在报表中显示为分层列表:
https://dba.stackexchange.com/questions/217582
复制相似问题