我正在嘗試編寫一個查詢,該查詢將採用有限數量的歷史記錄並將結果顯示在一行中。使用表值函數返回列中的數據而不是行
例如,我有一桌子的人:
|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
如何返回字段中的每個返回的行?
在此先感謝。
要明確,你只想返回三個城鎮是否正確?如果是這樣,您可以查看爲每個地址分配一個排名(1,2或3),然後使用該排名值運行一些插入語句,這些語句將填充結果表中的相應列。 – 2011-04-07 21:48:17
添加了一個工作示例。這很粗糙,可能不是做事的最佳方式,但希望它至少能給你一些想法。 – 2011-04-07 22:11:00