【问题标题】:How to return multiple values in one column (T-SQL)?如何在一列中返回多个值(T-SQL)?
【发布时间】:2010-09-12 11:36:52
【问题描述】:

我有一个表 UserAliases (UserId, Alias),每个用户有多个别名。我需要查询它并返回给定用户的所有别名,诀窍是将它们全部返回在一列中。

例子:

UserId/Alias  
1/MrX  
1/MrY  
1/MrA  
2/Abc  
2/Xyz

我想要以下格式的查询结果:

UserId/Alias  
1/ MrX, MrY, MrA  
2/ Abc, Xyz

谢谢。

我使用的是 SQL Server 2005。

附言实际的 T-SQL 查询将不胜感激:)

【问题讨论】:

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:

您可以将函数与 COALESCE 一起使用。

CREATE FUNCTION [dbo].[GetAliasesById]
(
    @userID int
)
RETURNS varchar(max)
AS
BEGIN
    declare @output varchar(max)
    select @output = COALESCE(@output + ', ', '') + alias
    from UserAliases
    where userid = @userID

    return @output
END

GO

SELECT UserID, dbo.GetAliasesByID(UserID)
FROM UserAliases
GROUP BY UserID

GO

【讨论】:

  • 在这种情况下,如果我在 UserAliases 表中使用 order by case,我可以尝试但如果在 select 语句中使用“order by alias”任何解决方案的另一种方式,我可能会尝试但不会成功.. 请...
【解决方案2】:

嗯...我看到一个答案已经被接受...但我认为您应该看到另一个解决方案:

/* EXAMPLE */
DECLARE @UserAliases TABLE(UserId INT , Alias VARCHAR(10))
INSERT INTO @UserAliases (UserId,Alias) SELECT 1,'MrX'
     UNION ALL SELECT 1,'MrY' UNION ALL SELECT 1,'MrA'
     UNION ALL SELECT 2,'Abc' UNION ALL SELECT 2,'Xyz'

/* QUERY */
;WITH tmp AS ( SELECT DISTINCT UserId FROM @UserAliases )
SELECT 
    LEFT(tmp.UserId, 10) +
    '/ ' +
    STUFF(
            (   SELECT ', '+Alias 
                FROM @UserAliases 
                WHERE UserId = tmp.UserId 
                FOR XML PATH('') 
            ) 
            , 1, 2, ''
        ) AS [UserId/Alias]
FROM tmp

/* -- OUTPUT
  UserId/Alias
  1/ MrX, MrY, MrA
  2/ Abc, Xyz    
*/

【讨论】:

    【解决方案3】:
    DECLARE @Str varchar(500)
    
    SELECT @Str=COALESCE(@Str,'') + CAST(ID as varchar(10)) + ','
    FROM dbo.fcUser
    
    SELECT @Str
    

    【讨论】:

      【解决方案4】:

      您可以使用游标遍历行并追加到临时表中的字段,也可以使用 COALESCE 函数连接字段。

      【讨论】:

        【解决方案5】:

        抱歉,第一次读错了问题。你可以这样做:

        declare @result varchar(max)
        
        --must "initialize" result for this to work
        select @result = ''
        
        select @result = @result + alias
        FROM aliases
        WHERE username='Bob'
        

        【讨论】:

          【解决方案6】:

          group_concat() 听起来像你要找的东西。

          http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

          因为您使用的是 mssql,所以我只是在 Google 上搜索了“group_concat mssql”,并找到了很多结果来重新创建 group_concat 功能。这是我发现的热门歌曲之一:

          http://www.stevenmapes.com/index.php?/archives/23-Recreating-MySQL-GROUP_CONCAT-In-MSSQL-Cross-Tab-Query.html

          【讨论】:

          • 问题针对MS-SQL
          • 但答案包含有关如何在 MySQL 中找到类似功能的信息
          猜你喜欢
          • 2013-09-22
          • 2021-10-05
          • 1970-01-01
          • 1970-01-01
          • 2015-05-12
          • 2013-12-09
          • 2017-08-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多