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存储过程获取所有往年记录的连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

sql 存储过程输入参数个数不定的写法

SQL 表中的基本 URL 连接字符串

如何在 Sql Server 2008 R2 存储过程中搜索字符串?

带有字符串连接的 SQL 很慢

获取 MS SQL Server 2008 的连接字符串

如何从 Access 2010 中的 SQL 存储过程返回多个记录集