Я пытаюсь написать запрос, который будет принимать ограниченное количество исторических записей и отображать результаты в одной строке.
Например, у меня есть таблица людей:
|PersonID|Forename|Surname
|--------|--------|----------
|00000001|Andy |Cairns
|00000002|John |Smith
И таблица всех их исторических адресов:
|PersonID|Date |Street |Town
-------------------------------------------
|00000001|2011-01-01|Main Street |MyTown
|00000001|2010-01-01|Old Street |OldTown
|00000002|2010-01-01|Diagon Alley |London
|00000001|2009-01-01|First Street |OtherTown
и т. Д.
Я хотел бы вернуть следующее:
|PersonID|Name |MoveDate1 |Town1 |MoveDate2 |Town2 |MoveDate3 |Town3
------------------------------------------------------------------------
|00000001|Andy |2011-01-01|MyTown|2010-01-01|OldTown|2009-01-01|OtherTown
|00000002|John |2010-01-01|London| | | |
НаСейчас я использую следующий запрос:
select PersonID, Name, s.mdate, s.town
from dbo.people
cross apply dbo.getAddressList as s
И следующую функцию табличного значения:
alter function [dbo].[getAddressList]
(
@personID
)
returns
@addresslisttable
(
mdate smalldatetime
town char
)
as
begin
insert into @addresslist (
mdate
town
)
select top 3 mdate, town
from dbo.addresses
where PersonID = @personID
order by mdate desc
return
end
К сожалению, это возвращает новую строку для каждого адреса, как это:
|PersonID|Name|MDate |Town
|00000001|Andy|2011-01-01|MyTown
|00000001|Andy|2010-01-01|OldTown
|00000001|Andy|2009-01-01|OtherTown
Как можно вместо этого вернуть каждую возвращенную строку в поле?
Заранее спасибо.