2016-04-22 3 views
2

私は3つのテーブル:Animal,CareTaker、およびApppointmentを持っているとします。いくつかのデータを含むスキーマ:View in TSQLの列として行を選択する方法?

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 

私は各動物の世話人を列として3つだけ選択したいと思います。このようなもの: enter image description here

私は他の任命については気にしませんが、次の3つは各動物についてです。 3つの予定がない場合は、空白/空白にすることができます。

私はこれを行う方法についてかなり混乱しています。

私は、サブクエリでそのような何かを、それを試してみました:

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 

しかし、第二世話人のために、私はわからないので(句は、トップ1からIDを除外する場所の選択第二のレベルを行かなければならないでしょう

他に2番目の行を得るにはどうすればいいですか?) select top 1 after excluding first row id; where first row id is (select top 1)のようなものです。

これは素晴らしい方法のようには見えません。

希望の出力を得るにはどうすればよいですか?

答えて

2

あなたは使用して行にすべての情報を取得することができます。

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; 

その後、あなたは基本的にこれを旋回するようにしたいです。 1つの方法はpivotキーワードを使用します。別の条件付き集計。私は後者を好む。いずれかのために、あなたはrow_number()を使用して提供されたピボット列、必要があります。

select animal, 
     max(case when seqnum = 1 then caretaker end) as caretaker1, 
     max(case when seqnum = 1 then appointmentdate end) as appointmentdate1, 
     max(case when seqnum = 2 then caretaker end) as caretaker2, 
     max(case when seqnum = 2 then appointmentdate end) as appointmentdate2, 
     max(case when seqnum = 3 then caretaker end) as caretaker3, 
     max(case when seqnum = 3 then appointmentdate end) as appointmentdate3 
from (select an.name as animal, ct.name as caretaker, a.appointmentdate, 
      row_number() over (partition by an.id order by a.appointmentdate) as seqnum 
     from appointments a join 
      animals an 
      on a.id = an.animalid join 
      caretaker c 
      on a.caretakerid = c.id 
    ) a 
group by animal; 
+0

をこんにちは、ありがとう、私は今、ピボットテーブルに探しています...あなたのクエリは非常に私がやりたいことはありませんします。http:// i.imgur.com/jQrcydK.pngトップは私の元の投稿のサブクエリで、下はクエリ – LocustHorde

+0

@ LocustHordeです。 。 。残念ながら、SQL Fiddleを構築することはできません。しかし、これは3つの予定まで一緒に動物1行を返す必要があります。 –

+0

こんにちは、まあ、SQL Fiddleはしばらくの間私のために壊れてしまった、私は構築するか、既存のURLを読み込むことはできません。 'seqnum'と' row_number() 'が何をしているのか説明してください。クエリが機能せず、列への行の転置の仕方が分かりません – LocustHorde