如何将结果行组合成用逗号分隔的单行

时间:2014-09-24 19:47:39

标签: sql sybase-ase

我一直在尝试将查询结果合并为一行,每组标记和关联ID值用逗号分隔。

使用以下值:

tag         associatedid
MA2D8111AM  MA2D811S
MA2D8112AM  MA2D811S
MA2D8113AM  MA2D811S
MA2D8114AM  MA2D811S
MA2D8115AM  MA2D811S
MA2D8116AM  MA2D811S
MA2D8117AM  MA2D811S
MA2D8118AM  MA2D811S
MA2D8119AM  MA2D811S

我想以这样的方式选择这些值:它们将显示如下:

MA2D8111AM:MA2D811S,MA2D8112AM:MA2D811S,MA2D8113AM:MA2D811S,MA2D8114AM:MA2D811S,MA2D8115AM:MA2D811S,MA2D8116AM:MA2D811S,MA2D8117AM:MA2D811S,MA2D8118AM:MA2D811S,MA2D8119AM:MA2D811S

我已经设法使用以下内容将两列与“:”组合在一起,但老实说根本不知道如何在同一行上组合所有标记和关联ID:

SELECT tag+":"+associatedid FROM tagidtable

在阅读sql_server示例时,在sybase中应用COALESCE时,我无法复制用户的成功。任何提示或反馈将非常感激。

2 个答案:

答案 0 :(得分:1)

这将适用于现代版本的SQL服务器,但我怀疑sybase是否具有与“FOR XML”相同的语法和功能

SELECT SUBSTRING(
    (SELECT  ', ' + RTRIM(tag+':'+associatedid) [text()]
     FROM tagidtable  
     FOR XML PATH('') 
    ), 2, 1000000000)  

答案 1 :(得分:1)

我不熟悉sybase中可用的内容,但我认为你可以做一些while循环。这应该让你开始,我会将其转换为可重用的函数。我没有把它放在一个光标中,只允许你接下来取而代之,我只是把1,2,3,4但我只是想说明这个想法而不提供确切的代码: - )

CREATE TABLE ConvertRowsToSingleCell
(
    sequence int
    ,tag varchar(max)
    ,associatedId varchar(max)
)

INSERT INTO ConvertRowsToSingleCell
VALUES 
    (1,'MA2D8111AM', 'MA2D811S')
    ,(2, 'MA2D8112AM', 'MA2D811S')
    ,(3, 'MA2D8113AM', 'MA2D811S')
    ,(4, 'MA2D8114AM', 'MA2D811S')

DECLARE @Length int = (Select COUNT(*) FROM ConvertRowsToSingleCell)
        ,@Increment int = 1
        ,@Item varchar(max)
        ,@ConcatenatedString varchar(max);

WHILE @Increment <= @Length
BEGIN

    IF (@Increment = @Length) --Remove comma at end
        BEGIN
            Select @Item = tag + ':' + associatedId from ConvertRowsToSingleCell
            where @Increment = sequence
        END
    ELSE
        BEGIN
            Select @Item = tag + ':' + associatedId + ', ' from ConvertRowsToSingleCell
            where @Increment = sequence
        END
    Set @ConcatenatedString = ISNULL(@ConcatenatedString,'') + @Item
    SET @Increment = @Increment + 1 
END

Select @ConcatenatedString