SQL存储过程获取所有往年记录的连接字符串
Posted
技术标签:
【中文标题】SQL存储过程获取所有往年记录的连接字符串【英文标题】:SQL stored procedure to get concatenated string of all previous years records 【发布时间】:2014-06-15 06:53:25 【问题描述】:我有一张表,里面有时间列。我正在尝试创建一个存储过程(SQL Server 2008)来为每一行获取一个字符串,其中包含所有前几年的最后一个值和当前行值。例如,如果我有下表。
_________________ 时间价值 _________________ 2009 年 3 月 1 _________________ 2009 年 5 月 2 _________________ 2010 年 1 月 3 _________________ 2011 年 4 月 4 _________________ 2011 年 2 月 5 _________________ 2012 年 1 月 6 _________________我正在尝试得到以下结果
____________________________________________________ 时间价值 结果 ____________________________________________________ 2009 年 3 月 1 “2009,1” ____________________________________________________ 2009 年 5 月 2 “2009,2” ____________________________________________________ 2010 年 1 月 3 "2009,2,2010,3" ____________________________________________________ 2011 年 4 月 4 "2009,2,2010,3,2011,4" ____________________________________________________ 2011 年 2 月 5 "2009,2,2010,3,2011,5" ____________________________________________________ 2012 年 1 月 6 "2009,2,2010,3,2011,5,2012,6" ____________________________________________________【问题讨论】:
【参考方案1】:以下是示例,但出于性能目的,最好对原始表格进行一些更改。
-- first we need to extract months/years to get comparable and sortable values
-- otherwise we can't select "all previous years" and "last value".
;with converted as (
select
time,
right(time, 4) as year,
datepart(m, '2000-' + left(time, 3) + '-01') as month,
right(time, 4) + ',' + convert(varchar(16), value) as concatenated,
value
from
YourTableName --TODO: Replace this with your table name
)
select
time,
value,
-- using xml for string concatenation
isnull((
select
prev.concatenated + ',' as 'text()'
from
converted as prev
where
prev.year < main.year
and prev.month = (select max(month) from converted lookup where lookup.year = prev.year)
for
xml path('')
),'')
+ main.concatenated
from
converted as main
【讨论】:
【参考方案2】:您将需要执行一个简单的 SELECT 来获取所有相关记录,然后遍历所有记录并将您要查找的所需输出连接成一个字符串(您可以在每个循环中输出累积的数据)。 http://www.techonthenet.com/sql_server/loops/for_loop.php
【讨论】:
以上是关于SQL存储过程获取所有往年记录的连接字符串的主要内容,如果未能解决你的问题,请参考以下文章