代码之家  ›  专栏  ›  技术社区  ›  user65266

在T-SQL-SQL Server 2005中将行转换为列

  •  1
  • user65266  · 技术社区  · 16 年前

    我有这样的情况:我在结构中有一张桌子

    ID, name
     1, 'value1'
     1, 'value2'
     2, 'value3'
     2, 'value4'
     1, 'value5'
    

    我想用以下格式显示上述数据

    id , combineName
    1  ,'value1','value2', 'value5'
    2  ,'value3','value4'
    

    在SQL Server 2005中是否有一种简单的方法可以做到这一点,或者我必须运行游标才能做到这一点?

    4 回复  |  直到 14 年前
        1
  •  1
  •   SqlACID    16 年前

    假设您的数据是可表的:

    create  FUNCTION toCSV (@id int)
    
    RETURNS varchar(100)
    
    AS
    
    BEGIN
    
    DECLARE @List varchar(100)
    
    SELECT @List = COALESCE(@List + ', ', '') + 
       CAST(name AS varchar(10))
    
    FROM aTable
    
    WHERE ID = @id
    
    RETURN(@list)
    
    END;
    
    go
    

    然后:

    从表中选择distinct id,dbo.tocsv(id)

        2
  •  1
  •   atfergs    16 年前

    SQL 2005有一个透视函数,该函数应该执行您想要的操作。 http://msdn.microsoft.com/en-us/library/ms177410.aspx

        3
  •  0
  •   cjk    16 年前

    您可以使用嵌套的选择来实现这一点,或者更容易地使用Pivot运算符,尽管您必须事先知道所有可能的值。

    如果您希望它是动态的,那么您将需要一个光标和一些动态SQL。

        4
  •  0
  •   Amit Yenurkar    16 年前

    合并函数的简单示例:

    创建了一个临时表,在while循环的帮助下,我在其中放置了9行。 在主体部分,我只需要取列来合并函数。

    升降台材料 设置计数 创建表材料 (

    MaterialID INT
    

    )

    声明@loopcounter int 声明@maxloopcounter int

    设置@loopcounter=1 设置@maxloopcounter=10

    同时(@loopcounter<@maxloopcounter) 开始 插入材料(物化)值(@loopcounter) 设置@loopcounter=@loopcounter+1 结束

    /*主要部分*/ 声明@materialid varchar(100)

    从材质中选择@materialid=coalesce(@materialid+'、'、'')+cast(materialid as varchar(100))。

    print'最终输出:'+@materialid

    --从材料中选择* 设置零计数