我一直在尝试将查询结果合并为一行,每组标记和关联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时,我无法复制用户的成功。任何提示或反馈将非常感激。
答案 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