Sql server 2008 如何在TSQL中选择行作为查看列?

Sql server 2008 如何在TSQL中选择行作为查看列?,sql-server-2008,tsql,Sql Server 2008,Tsql,假设我有3张桌子:动物、看护人和应用点。模式,其中包含如下数据: Create Table Animal (Id int identity, Name varchar(25)) Create Table CareTaker(Id int identity, Name varchar(50)) Create Table Appointments(Id int identity, AnimalId int, CareTakerId int, AppointmentDate DateTime, Boo

假设我有3张桌子:动物、看护人和应用点。模式,其中包含如下数据:

Create Table Animal (Id int identity, Name varchar(25))
Create Table CareTaker(Id int identity, Name varchar(50))
Create Table Appointments(Id int identity, AnimalId int, CareTakerId int, AppointmentDate DateTime, BookingDate DateTime)

Insert into Animal(Name) Values('Ghost'), ('Nymeria'), ('Greywind'), ('Summer')
Insert into CareTaker(Name) Values ('Jon'), ('Arya'), ('Rob'), ('Bran') 

Insert into Appointments(AnimalId, CareTakerId, AppointmentDate, BookingDate) Values
(1, 1, GETDATE() + 7, GetDate()), -- Ghost cared by Jon
(1, 2, GETDATE() + 6, GetDate()), -- Ghost cared by Arya
(4, 3, GETDATE() + 8, GetDate()) -- Summer cared by Rob
select Name, 
    -- Care Taker 1
    (Select Top 1 C.Name
    From Appointments A
        Join CareTaker C on C.Id = A.CareTakerId
    Where A.AppointmentDate > GETDATE()
        And A.AnimalId = Animal.Id
    Order By AppointmentDate) As CareTaker1,
    -- Appointment Date 1
    (Select Top 1 AppointmentDate
    From Appointments
    Where AppointmentDate > GETDATE()
        And AnimalId = Animal.Id
    Order By AppointmentDate) As AppointmentDate1
From Animal
我只想为每只动物选择3名看护人作为一列。大概是这样的:

我不在乎其他的约会,只是接下来的三个,每只动物。如果没有三个约会,则可以为空/空

我对怎么做很困惑

我尝试了子查询,类似这样:

Create Table Animal (Id int identity, Name varchar(25))
Create Table CareTaker(Id int identity, Name varchar(50))
Create Table Appointments(Id int identity, AnimalId int, CareTakerId int, AppointmentDate DateTime, BookingDate DateTime)

Insert into Animal(Name) Values('Ghost'), ('Nymeria'), ('Greywind'), ('Summer')
Insert into CareTaker(Name) Values ('Jon'), ('Arya'), ('Rob'), ('Bran') 

Insert into Appointments(AnimalId, CareTakerId, AppointmentDate, BookingDate) Values
(1, 1, GETDATE() + 7, GetDate()), -- Ghost cared by Jon
(1, 2, GETDATE() + 6, GetDate()), -- Ghost cared by Arya
(4, 3, GETDATE() + 8, GetDate()) -- Summer cared by Rob
select Name, 
    -- Care Taker 1
    (Select Top 1 C.Name
    From Appointments A
        Join CareTaker C on C.Id = A.CareTakerId
    Where A.AppointmentDate > GETDATE()
        And A.AnimalId = Animal.Id
    Order By AppointmentDate) As CareTaker1,
    -- Appointment Date 1
    (Select Top 1 AppointmentDate
    From Appointments
    Where AppointmentDate > GETDATE()
        And AnimalId = Animal.Id
    Order By AppointmentDate) As AppointmentDate1
From Animal
但对于第二个管理员,我必须使用第二级select on where子句将id从top 1中排除,因为不确定如何获得第二行,比如在排除第一行id后选择top 1;其中第一行id为“选择前1位”

无论如何,这看起来不是一个很好的方法

请问我怎样才能得到想要的输出

您可以使用以下方法获取行中的所有信息:

select an.name as animal, ct.name as caretaker, a.appointmentdate
from appointments a join
     animals an
     on a.id = an.animalid join
     caretaker c
     on a.caretakerid = c.id;
然后,你基本上要围绕这个。一种方法使用pivot关键字。另一个条件聚合。我喜欢后者。对于这两种情况,您都需要一个数据透视列,该数据透视列使用以下行编号提供:


嗨,谢谢,我现在正在查看透视表。。您的查询并没有完全满足我的要求:顶部是来自我原始帖子的子查询,底部是您的查询query@LocustHorde . . . 不幸的是,我无法构建SQL FIDLE。然而,这应该是每个动物返回一行以及最多三个约会。您好,是的,SQL Fiddle已经为我中断了一段时间,我无法构建或加载任何现有URL。你能解释一下seqnum和row_number在做什么吗?查询不起作用,我不明白它是如何将行转换为列的。实际上,我已经解决了,您在内部select中加入了错误的ID。。尽管如此,如果您能解释这一行的作用,它还是会很有帮助的:按a.Id顺序按t.AppointmentDate作为seqnum划分的行数,以及当seqnum=1时它与maxcase的关系,然后看门人结束作为看门人1,-thanksrow\u number是一个枚举行的窗口函数;您应该从文档开始。最大。只是使用顺序值的条件聚合。